您的位置:首頁>正文

搭建mysql主從伺服器實戰資料熱備,這些知識你都知道嗎?

廢話不多少, 直接上乾貨!

mysql主從複製概述:

複製解決的基本問題是讓一台伺服器的資料和另外的伺服器保持同步。

一台主要伺服器可以連接多台從伺服器, 並且從伺服器也可以反過來作主要伺服器。

主要伺服器和從伺服器可以位於不同的網路拓撲中, 還能對整台伺服器、特定的資料庫, 甚至特定的表進行複製。

主從伺服器的版本必須一致。

主要伺服器版本可以低一些的, 從伺服器版本要高一些。

1.2 . 複製解決的問題

MySQL複製技術有以下一些特點:

(1) 資料分佈 (Data distribution )

(2) 負載平衡(load balancing)

(3) 備份(Backups)

(4) 高可用性和容錯移轉 High availability and failover

1.3 複製如何工作

整體上來說, 複製有3個步驟:

(1) master將改變記錄到二進位日誌(binary log)中(這些記錄叫做二進位日誌事件, binary log events);

(2) slave將master的binary log events拷貝到它的中繼日誌(relay log);

(3) slave重做中繼日誌中的事件, 修改salve上的資料。

mysql主從複製中:

第一步:master記錄二進位日誌。 在每個事務更新資料完成之前, master在二日誌記錄這些改變。

MySQL將事務寫入二進位日誌, 即使事務中的語句都是交叉執行的。 在事件寫入二進位日誌完成後, master通知存儲引擎提交事務。

第二步:slave將master的binary log拷貝到它自己的中繼日誌。 首先, slave開始一個工作執行緒——I/O執行緒。 I/O執行緒在master上打開一個普通的連接, 然後開始binlog dump process。 Binlog dump process從master的二進位日誌中讀取事件, 如果已經執行完master產生的所有檔, 它會睡眠並等待master產生新的事件。 I/O執行緒將這些事件寫入中繼日誌。

第三步:SQL slave thread(SQL執行緒)處理該過程的最後一步。 SQL執行緒從中繼日誌讀取事件, 並重新執行其中的事件而更新slave的資料, 使其與master中的資料一致。

模式: C/S 模式

埠:3306

實戰:實戰mysql主從配備

xuegod63 主mysql伺服器配置

安裝資料庫:

[root@xuegod63 ~]# yum install mysql-server -y

[root@xuegod63 ~]# service mysqld start

創建要同步的資料庫:

[root@xuegod63 ~]# mysql -h 127.0.0.1 -u root -p #連接資料庫

或:

[root@xuegod63 ~]# mysql

mysql> create databasecd;

mysql> use cd;

mysql> create table test1 (id int); 欄位名 資料類型

mysql> show tables;

停止mysql主服務

[root@xuegod63 ~]# service mysqld stop

配置mysql主要同步的資料庫名字並開啟對應的二進位日誌

#vim /etc/my.cnf # my.cnf 是mysql 主設定檔

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0 #在原設定檔中,添加以下內容:

log-bin=mysqllog

server-id=1

binlog-do-db=cd

注釋:

log-bin=mysqllog #啟用二進位日誌,預設存在/var/lib/mysql 下面

server-id=1 #本機資料庫ID 唯一標示。

binlog-do-db=cd #可以被從伺服器複製的庫。二進位需要同步的資料庫名

# binlog-ignore-db=mk2 不可以被從伺服器複製的庫

重新啟動

[root@xuegod63 ~]# service mysqld restart

授權

mysql> grant replication slave on *.* to slave@192.168.10.64 identified by "123456";

在從xuegod64上測試登錄:

[root@xuegod64 ~]# mysql -h 192.168.10.63 -u slave -p123456

複製前保證主從兩個資料庫資料一致:

把主的原始數據傳給從:

例:匯出所有資料庫:

[root@xuegod63 ~]# mysqldump -u root -p -A > all1.sql

參數:-A, --all-databases Dump all the databases.

資料庫複製到xuegod64上:

方法1:scp all1.sql 192.168.10.64:/root

[root@xuegod64 ~]# mysql -u root -p < all1.sql="">

Enter password:

[root@xuegod64 ~]# mysql

mysql> show databases;

mysql> usecd;

mysql> show tables;

修改從伺服器設定檔:

[root@xuegod64 ~]#vim/etc/my.cnf

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

#在設定檔中寫入以下內容

server-id=2 #從伺服器ID號,不要和主ID相同 ,如果設置多個從伺服器,每個從伺服器必須有一個唯一的server-id值,必須與主要伺服器的以及其它從伺服器的不相同。可以認為server-id值類似於IP位址:這些ID值能唯一識別複製伺服器叢集中的每個伺服器實例。

master-host=192.168.10.63 #指定主要伺服器IP位址

master-user=slave #指定在主要伺服器上可以進行同步的用戶名

master-password=123456 #密碼

####以下可以不寫

master-port = 3306 #同步所用的埠

master-connect-retry=60 #中斷點重新連線時間

保存,重啟

#service mysqld restart

測試:

主要伺服器上查看:

mysql> show master status;

ERROR 2006 (HY000): MySQL server has gone away

No connection. Trying to reconnect...

Connection id: 2

Current database: mk1

+-----------------+----------+--------------+------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+-----------------+----------+--------------+------------------+

| mysqllog.000001 | 106 | mk1 | |

主要伺服器是正常狀態

從伺服器上查看:

mysql> show slave status \G

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.1.63

Master_User: slave

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysqllog.000001

Read_Master_Log_Pos: 315

Relay_Log_File: mysqld-relay-bin.000002

Relay_Log_Pos: 459

Relay_Master_Log_File: mysqllog.000001

Slave_IO_Running: Yes #可以看到這兩個Yes,說明從伺服器安裝成功。

Slave_SQL_Running: Yes

Slave_IO_Running :一個負責與主機的io通信

Slave_SQL_Running:負責自己的slave mysql進程

測試:資料同步

xuegod63寫資料:

mysql> use cd;

Database changed

mysql> show tables;

+--------------+

| Tables_in_cd |

+--------------+

| test1 |

+--------------+

1 row in set (0.00 sec)

mysql> insert into test1 values(1);

xuegod64讀數據:

mysql> use cd;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

mysql> select * from test1;

+------+

| id |

+------+

| 1 |

+------+

排錯:

同步之前如果懷疑主從資料不同步可以採取:上面冷備份遠端拷貝法或者在從伺服器上命行同步方法。

mysql> show tables;

停止mysql主服務

[root@xuegod63 ~]# service mysqld stop

配置mysql主要同步的資料庫名字並開啟對應的二進位日誌

#vim /etc/my.cnf # my.cnf 是mysql 主設定檔

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0 #在原設定檔中,添加以下內容:

log-bin=mysqllog

server-id=1

binlog-do-db=cd

注釋:

log-bin=mysqllog #啟用二進位日誌,預設存在/var/lib/mysql 下面

server-id=1 #本機資料庫ID 唯一標示。

binlog-do-db=cd #可以被從伺服器複製的庫。二進位需要同步的資料庫名

# binlog-ignore-db=mk2 不可以被從伺服器複製的庫

重新啟動

[root@xuegod63 ~]# service mysqld restart

授權

mysql> grant replication slave on *.* to slave@192.168.10.64 identified by "123456";

在從xuegod64上測試登錄:

[root@xuegod64 ~]# mysql -h 192.168.10.63 -u slave -p123456

複製前保證主從兩個資料庫資料一致:

把主的原始數據傳給從:

例:匯出所有資料庫:

[root@xuegod63 ~]# mysqldump -u root -p -A > all1.sql

參數:-A, --all-databases Dump all the databases.

資料庫複製到xuegod64上:

方法1:scp all1.sql 192.168.10.64:/root

[root@xuegod64 ~]# mysql -u root -p < all1.sql="">

Enter password:

[root@xuegod64 ~]# mysql

mysql> show databases;

mysql> usecd;

mysql> show tables;

修改從伺服器設定檔:

[root@xuegod64 ~]#vim/etc/my.cnf

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

#在設定檔中寫入以下內容

server-id=2 #從伺服器ID號,不要和主ID相同 ,如果設置多個從伺服器,每個從伺服器必須有一個唯一的server-id值,必須與主要伺服器的以及其它從伺服器的不相同。可以認為server-id值類似於IP位址:這些ID值能唯一識別複製伺服器叢集中的每個伺服器實例。

master-host=192.168.10.63 #指定主要伺服器IP位址

master-user=slave #指定在主要伺服器上可以進行同步的用戶名

master-password=123456 #密碼

####以下可以不寫

master-port = 3306 #同步所用的埠

master-connect-retry=60 #中斷點重新連線時間

保存,重啟

#service mysqld restart

測試:

主要伺服器上查看:

mysql> show master status;

ERROR 2006 (HY000): MySQL server has gone away

No connection. Trying to reconnect...

Connection id: 2

Current database: mk1

+-----------------+----------+--------------+------------------+

| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |

+-----------------+----------+--------------+------------------+

| mysqllog.000001 | 106 | mk1 | |

主要伺服器是正常狀態

從伺服器上查看:

mysql> show slave status \G

*************************** 1. row ***************************

Slave_IO_State: Waiting for master to send event

Master_Host: 192.168.1.63

Master_User: slave

Master_Port: 3306

Connect_Retry: 60

Master_Log_File: mysqllog.000001

Read_Master_Log_Pos: 315

Relay_Log_File: mysqld-relay-bin.000002

Relay_Log_Pos: 459

Relay_Master_Log_File: mysqllog.000001

Slave_IO_Running: Yes #可以看到這兩個Yes,說明從伺服器安裝成功。

Slave_SQL_Running: Yes

Slave_IO_Running :一個負責與主機的io通信

Slave_SQL_Running:負責自己的slave mysql進程

測試:資料同步

xuegod63寫資料:

mysql> use cd;

Database changed

mysql> show tables;

+--------------+

| Tables_in_cd |

+--------------+

| test1 |

+--------------+

1 row in set (0.00 sec)

mysql> insert into test1 values(1);

xuegod64讀數據:

mysql> use cd;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

mysql> select * from test1;

+------+

| id |

+------+

| 1 |

+------+

排錯:

同步之前如果懷疑主從資料不同步可以採取:上面冷備份遠端拷貝法或者在從伺服器上命行同步方法。

同類文章
Next Article
喜欢就按个赞吧!!!
点击关闭提示