前言
面試遇到的問題坤塞,當時沒答上风范,現研究整理一下静袖。
基礎說明
主庫:192.168.33.18
從庫:192.168.33.15
主要流程
- 主庫將數據庫所有的增刪改操作記錄在
Binlog
中 - 從庫復制主庫的
Binlog
文件到本地 - 從庫讀取日志中的事件岔乔,并執(zhí)行
設置主庫
開啟Binlog
修改 MySQL
的配置文件 my.cnf
:
sudo vim /etc/mysql/my.cnf
添加主庫的配置:
[mysqld]
# 指定 Binlog 的位置
log-bin=/var/log/mysql/mysql-bin.log
# 指定主庫的 server id
server-id=1
# 可以指定需要記錄的庫
# 需要記錄多個庫,只需要重復配置 binlog-do-db
binlog-do-db=test_db
# 也可以指定不需要記錄的庫
binlog-ignore-db=mysql
配置文件修改過后,需要重啟 MySQL
才可以生效:
sudo service mysql restart
這時,登錄 MySQL
,查看主庫的 Position
值:
show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 | 110 | | | |
+------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
可以看到 File
和 Position
兩個信息劳曹,這個在配置從庫時需要用到。
創(chuàng)建從庫角色
# 分配角色琅摩,這個命令會主動創(chuàng)建用戶
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.33.15' IDENTIFIED BY '123456';
# 刷新權限
FLUSH PRIVILEGES;
數據導出
首先:停機L酢!房资!雖然網上有不少加讀鎖的蜕劝,可是加了讀鎖同樣會影響業(yè)務,還是停機來的更加徹底轰异。
接下來就是將數據導出了岖沛,可以直接拷貝所有數據庫文件,也可以使用 mysqldump
溉浙。
命令如下[1]:
# 針對事務性引擎
mysqldump -uroot -ptiger --all-database -e --single-transaction --flush-logs --max_allowed_packet=1048576 --net_buffer_length=16384 > /data/all_db.sql
# 針對 MyISAM 引擎烫止,或多引擎混合的數據庫
mysqldump -uroot --all-database -e -l --flush-logs --max_allowed_packet=1048576 --net_buffer_length=16384 > /data/all_db.sql
從庫配置
這里有一個注意點蒋荚,就是要確保能夠連通主庫戳稽,所以建議先用命令行登錄主庫的
MySQL
。
修改配置文件
sudo vim /etc/mysql/my.cnf
添加從庫配置:
[mysqld]
# 配置 server id
# 這里的 server-id 需要和從庫的不一樣期升,不然同步會報錯
server-id=2
配置完成后惊奇,需要重啟 MySQL
:
sudo service mysql restart
導入數據
為保持主從數據庫在一個起點,需要導入主庫備份好的數據播赁。
數據文件 all_db.sql
來自上述導出颂郎。
mysql -h 127.0.0.1 -u root -p < all_db.sql
指定master
主要就是配置主庫的 host
、user
容为、password
乓序、port
等寺酪。
CHANGE MASTER TO
MASTER_HOST='192.168.33.18',
MASTER_USER='slave',
MASTER_PASSWORD='123456',
MASTER_PORT=3306,
MASTER_LOG_FILE='mysql-bin.00001',
MASTER_LOG_POS='110';
開啟從庫
start slave;
至此,配置成功替劈。
測試
創(chuàng)建一個名為 test_db
的數據庫寄雀。
創(chuàng)建一張表。
刪除庫陨献。
檢測成功盒犹。
踩坑
配置期間遇到過幾個問題,現記錄一下眨业。
1 Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work
首先檢查主庫和從庫配置的 server-id
是否一致急膀,若一致,則改為不一致龄捡,然后重啟數據庫卓嫂。
若不一致,再檢查 /var/lib/mysql/auto.cnf
[2] 里的 server-uuid
是否一致聘殖,若一致命黔,則刪除其中一個,然后重啟數據庫就斤。
若再不行悍募,還是 Google
吧。
2 Got fatal error 1236 from master when reading data from binary log: 'Binary log is not open'
是因為主庫的配置文件沒有生效洋机,檢查主庫配置坠宴,然后重啟數據庫。再在從庫 start slave;
就好绷旗。
3 error connecting to master 'slave@192.168.33.18:3306' - retry-time: 60 retries: 1
鏈接主庫錯誤喜鼓,需要檢查主庫分配的角色和權限是否正確。
參考文獻
[1] mysql主從復制及問題解決
-- EOF --
本文轉載自IMJCW
原文鏈接:MySQL主從同步配置