MySql主從複製:異步複製

目錄

一、Master配置

二、Slave配置

三、簡單排錯

四、常用命令與參數配置


主庫將編輯(非查詢)操作寫入到bin log中,從庫負責讀取主庫的bin log,並在本地複製一份到relay log中,然後將relay log中的操作在從庫執行一遍。

每個從庫需要配置讀取主庫日誌的文件名和日誌位置,否則會執行已經存在數據的操作,從而導致異常。

主庫和從庫都必須有一個唯一的server_id,在my.cnf中配置。

一、Master配置

1、在my.cnf中開啓bin log並設置server-id:vi /etc/my.cnf

[mysqld]
log-bin=mysql-bin  #設置mysql binlog的文件名前綴,如果不設置則默認爲hostname-bin,如果修改了主機名,binlog文件也會隨之改變,所以建議自己定義log-bin的文件名
server-id=11  #在主從庫中保持唯一,取值範圍爲正整數uint32

     重啓數據庫:systemctl restart mysqld;

2、關閉主庫my.cnf中的skip-networking參數,否則會導致主從庫之間不能通訊。【默認可省略】

3、查看bin-log 開啓狀態:show variables like '%log_bin%';

     查看server-id配置是否成功:show variables like '%server%';

4、添加一個用於同步的主庫用戶,此用戶只需要有複製權限:

     創建用戶: create user '用戶名'@'%' identified by '密碼';

     賦予權限: GRANT REPLICATION SLAVE ON *.* TO '用戶名'@'%';

5、設置主庫爲只讀,不允許配置期間有任何的數據庫修改操作:FLUSH TABLES WITH READ LOCK;

6、獲取主庫bin log日誌信息,並記錄下文件名稱(file)和位置信息(position):show master status;

7、將當前的整個數據庫備份還原到從庫上:備份還原mysqldump  或  mysql備份還原:文件遷移

      備份數據庫:mysqldump -u root -p --databases test > /data/mysql/test.sql

      使用sftp傳輸文件過去:

                                    連接從庫服務器:  sftp 192.168.119.130

                                    傳輸文件:  put /data/mysql/test.sql /data/mysql/test.sql
              在從庫中登錄mysql並執行命令來還原數據庫:source /data/mysql/test.sql

8、做好數據庫備份之後就可以釋放只讀鎖了:UNLOCK TABLES;

二、Slave配置

1、配置從庫my.cnf的server-id,不做級聯複製不必開啓bin log:vi /etc/my.cnf

       server-id=12

       重啓mysql:systemctl restart mysqld;

2、指定主庫信息

CHANGE MASTER TO
MASTER_HOST = '主庫IP',
MASTER_PORT = 主庫端口,
MASTER_USER = '主庫登錄用戶名',
MASTER_PASSWORD = '主庫登錄密碼',
MASTER_LOG_FILE = '主庫bin log日誌文件名(配置Master第6步記錄下的)',
MASTER_LOG_POS = 主庫bin log文件位置(配置Master第6步記錄下的);

 

3、啓動從庫的複製進程:start slave;

4、查看複製狀態:show slave status\G   

       看到slave_io_running和slave_sql_running皆爲yes就成功了,否則查看last_error來排錯


     5、在主庫中修改數據,並在從庫中查看。

三、簡單排錯

1、連接錯誤

a、將my.cnf文件中的以下命令取消註釋,如果沒有此命令則加上:

           default-authentication-plugin=mysql_native_password 

b、重啓Mysql服務: systemctl restart mysqld; 

      啓動從庫複製進程:start slave;

      重新查看狀態:show slave status\G   

 2、其他錯誤

3、當從節點遇到無關緊要的錯誤,可以直接跳過:

STOP SLAVE;

SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;

START SLAVE; 

四、常用命令與參數配置

命令 描述
show slave status

檢查從庫slave複製的狀態,是否正常。

Slave_IO_State:代表當前slave的狀態;

Slave_IO_Running:負責讀取主庫bin log的IO線程是否運行;

Slave_SQL_Running:負責執行備庫relay log的SQL線程是否運行;

Last_IO_Error:IO線程最後一次發生的錯誤信息;

Last_SQL_Error:SQL線程最後一次發生的錯誤信息;

Seconds_Behind_Master:備庫的SQL線程比主庫的bin log晚多少秒,0代表木有複製延遲;

SQL_Delay:人工設置的主從複製延遲時間;

show processlist 查看MySql線程信息。
stop slave 停止slave複製

stop slave IO_THREAD

或SQL_THREAD

停止IO或者SQL執行線程
start slave 啓動slave複製

start slave IO_THREAD

或SQL_THREAD

啓動IO或者SQL執行進程
參數 描述 使用
replicate-do-db 指定需要複製的數據庫。

在my.cnf配置文件中使用:replicate-do-db=庫名

多個數據庫需要把這個參數寫多份。

replicate-do-table 指定需要複製的表 在my.cnf配置文件中使用:replicate-do-db=庫名.表名
replicate-ignore-table 指定不需要複製的表,把它過濾掉 在my.cnf中使用:replicate-ignore-db=庫名.表名
replicate-wild-do-table 複製符合匹配的表,可以使用_和%作爲通配符 在my.cnf中使用:replicate-wild-do-table=庫名.表名%
replicate-wild-ignore-table 排除符合匹配的表,可以使用_和%作爲通配符 在my.cnf中使用:replicate-wild-ignore-table=庫名.表名%
binlog-format

binlog日誌格式,有以下三種格式;

row:基於行,更安全但數據量更大

statement:基於sql語句

mixed:以上兩者的混合使用

在my.cnf中使用:binlog-format=row
slave-parallel-workers 在slave上啓用多個sql thread線程來並行應用數據。默認爲0。取值範圍0-1024 在my.cnf中使用:slave-parallel-workers=3
skip-slave-start 在mysql啓動時是否先不啓動slave線程,暫停複製 在my.cnf中使用:skip-slave-start=1
slave-parallel-type

啓動並行之後,採用什麼粒度的並行方式:

database:按不同的數據庫並行,默認的。

logical_clock:按binlog中一組提交的事務。

在my.cnf中使用:slave-parallel-type=database
slave-skip-errors 當slave的sql thread執行過程中可以忽略的錯誤,並繼續執行數據複製,正常情況下當有錯誤發生的時候會停止複製,人工處理後才能繼續。

在my.cnf中使用:

slave-skip-errors=errcode1,errcode2,....

slave-skip-errors=all

slave-skip-errors=ddl_exist_errors

binlog-do-db 指定被記錄到binlog的數據庫 在my.cnf中使用:binlog-do-db=庫名
change master to master_delay 從庫複製的延遲時間(秒) 在從庫my.cnf中使用:change master to master_delay=60
     
發佈了68 篇原創文章 · 獲贊 28 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章