傻逼CSDN在markdown的預覽模式把我英文引号給轉成中文引号了。
算标題黨一回,其實 mysql8 的主從同步跟 mysql5.7 的沒有什麼不同
master 端配置
配置檔案 vim /etc/my.cnf
[mysqld]
# 日志檔案名
log-bin = mysql-bin
# 要同步的資料庫
binlog-do-db = my_db_name
# 主資料庫端ID号
server-id = 1
# 跳過checksum的事件
binlog_checksum = none
然後重新開機
建立slave賬号
# grant replication slave on . to ‘slave’@’%’ identified by ‘xxxxxx’;
# flush privileges;
檢視master狀态
# show master status;
記住File和position的值,将這裡的值再下面的sql中執行
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000013 | 150 | octopus | | |
+------------------+----------+--------------+------------------+-------------------+
slave 端配置
配置檔案 vim /etc/my.cnf
[mysqld]
# 主資料庫ID号
server-id = 2
slave_sql_verify_checksum = NONE
replicate-do-db = my_db_name
#replicate-rewrite-db = my_db_name -> new_db_name
然後重新開機
執行同步指令,設定主資料庫ip,同步帳号密碼,同步位置
# change master to master_host=‘120.77.xx.xx’,master_user=‘slave’,master_password=‘xxxxxx’,master_log_file=‘mysql-bin.000013’,master_log_pos=150;
開啟同步功能
# start slave;
檢視同步狀态
# show slave status\G;
需要slave_io_runing和slave_sql_runing都是Yes,表示成功
注意事項1:
- 如果主庫已經投入使用了,此時如果需要主從同步。需要提前在某個時刻,執行 show master status; 然後記下 File 和 Position。這是主庫目前的 sql 執行進度。
- 使用指令行或者用戶端(這裡我使用的是 Navicat 的 Dump SQL File),導出所有表結構+資料。然後把這裡 SQL 在從庫中執行。
- 在從庫中,使用 change master to…語句把進度指向剛才記錄下的 File 和 Position 位置。然後開啟 start slave;
注意事項2:
對于主從同步,不同資料庫名,網上搜尋到的方法是在從庫配置檔案 /etc/my.cnf 使用「replicate-rewrite-db = my_db_name -> new_db_name」替代「replicate-do-db = my_db_name」。
實際操作中,對于表資料的增删改查可以運作成功。
但是如果涉及修改表結構語句,同步時候會報錯,比如:
Error 'Table 'my_db_name.table_name' doesn't exist' on query. Default database: 'new_db_name'. Query: 'ALTER TABLE `my_db_name`.`table_name`
MODIFY COLUMN `type` int(12) UNSIGNED NOT NULL COMMENT '類型' AFTER `name`'
因為這裡修改表結構會帶上資料庫的名字,如 「ALTER TABLE
my_db_name
.
table_name
…」
看來這個配置并不能全方位的生效啊。