MySQL 8 主從搭建
阿新 • • 發佈:2021-08-31
1、修改配置檔案
MySQL 搭建主從需要配置 my.cnf ,在主庫 my.cnf 的 [mysqld] 段落下新增如下內容:
[mysqld] # 設定server-id,唯一值,標識主機,必須與從庫不一致 server-id=1 # 開啟二進位制日誌,主庫必須開啟 log-bin=mysql-bin # 自動刪除2592000秒(30天)前的日誌 # 8.0以前的版本中這個配置為expire_logs_days,單位為天 binlog_expire_logs_seconds=2592000 # binlog記錄的模式 # statement模式不會記錄每一條更改語句,節約資源但主從資料可能不一致 # row模式記錄每一條更改的語句,日誌量非常大 # mixed模式是前兩者優點的綜合,但日誌結構較為複雜 binlog_format=mixed #設定只記錄binlog的庫,如果全庫 binlog-do-db=demo
在從庫 my.cnf 的 [mysqld] 段落下新增如下內容:
[mysqld] # 設定server-id,唯一值,標識主機,必須與主庫不一致 server-id=2 #設定只同步binlog的庫 replicate-do-db=demo
修改配置檔案之後記得重啟 MySQL 使配置檔案生效。
2、匯出主庫並還原
在主庫上使用 MySQL 自帶的 mysqldump 匯出需要同步的資料庫。
mysqldump -uroot -p --skip-lock-tables --single-transaction --flush-logs --hex-blob --master-data=2 demo > /demo.sql
引數說明:
--skip-lock-tables #不鎖表 --single-transaction #設定事務級別為可重複讀 --flush-logs #開啟一個新的binlog檔案 --hex-blob #以16進制導出blob資料 --master-data=2 #匯出資料庫時將binlog資訊也一併匯出,2表示註釋binlog資訊
匯出之後通過任意方式傳輸到從庫所在的伺服器上,並匯入該 SQL 檔案,匯入前記得先建立好和主庫一致的資料庫名。
mysql> use demo; Database changed mysql> source /demo.sql; Query OK, 0 rows affected (0.00 sec)
3、建立賬號(可選)
從庫連線主庫需要一個使用者,不在乎安全性的話也可以使用 root 使用者,那樣的話可以跳過這段。
但如果需要一個擁有最低許可權可以實現主從複製的使用者則可以手動建立並授權:
mysql> create user 'username'@'ip' identified by 'password'; Query OK, 0 rows affected (0.01 sec) mysql> grant replication slave,replication client on *.* to 'username'@'ip'; Query OK, 0 rows affected (0.00 sec)
replication slave 這個許可權用於主從複製,如果沒有這個許可權將不能同步資料。
replication client 則用於檢視從庫狀態,允許使用 “show slave status”命令。
4、配置主從
從匯出的 SQL 中獲取主庫的 binlog 資訊。
cat demo.sql | grep CHANGE -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000007', MASTER_LOG_POS=156;
由此可以得知主庫正在使用 mysql-bin.000007 這個 binlog 檔案,位置為 156 。
然後在從庫上配置需要連線的主庫資訊:
mysql> change master to master_host='slave ip', -> master_port=3306, -> master_user='username', -> master_password='password', -> master_log_file='mysql-bin.000007', -> master_log_pos=156; Query OK, 0 rows affected, 2 warnings (0.02 sec)
最後開啟主從複製:
mysql> start slave; Query OK, 0 rows affected, 1 warning (0.00 sec)
5、主從連線狀態
開啟主從同步之後通過命令檢視狀態:
mysql> show slave status\G *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: ip Master_User: username Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000007 Read_Master_Log_Pos: 517 Relay_Log_File: adam-relay-bin.000010 Relay_Log_Pos: 685 Relay_Master_Log_File: mysql-bin.000007 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: demo Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 517 Relay_Log_Space: 1108 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 1 Master_UUID: 10d10288-32ce-11eb-8674-00163e086d97 Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0 Network_Namespace: 1 row in set, 1 warning (0.00 sec)
當 Slave_IO_Running 和 Slave_SQL_Running 都為Yes的時候,表示主從同步正常。
原文地址:https://www.jianshu.com/p/e33c861c2141
其他參考:https://www.cnblogs.com/annez/p/14886410.html