目錄
主庫將編輯(非查詢)操作寫入到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 |