業務需要,正好自己從來沒有接觸過mysql運維相關,把步驟記錄下來。
環境信息
- MySQL 5.7.25
- 主庫172.24.7.108
- 從庫172.24.7.109
主庫創建同步角色
查看已有用戶
select distinct concat('User: ''',user,'''@''',host,''';') as query from mysql.user;
刪除用戶
drop user 'slave'@'172.24.7.109';
創建新用戶並限定訪問ip
create user 'slave'@'172.24.7.109' identified by '1234509876';
查詢用戶權限
show grants for 'slave'@'172.24.7.109';
開啓數據複製權限(replication slave不能只作用於某一數據庫,而是全局)
grant replication slave on *.* to 'slave'@'172.24.7.109';
刷新權限
flush privileges;
最終效果如下
修改主庫配置(/etc/my.cnf)
增加以下內容
[mysqld]
# 啓用日誌,默認爲mysql-bin,可替換爲指定的目錄
log-bin = mysql-bin
# 不可重複的序號
server-id = 1
# 日誌保存期限(可選)
expire_logs_days = 30
# 基於行紀錄,5.7.7及以後的版本默認是ROW
binlog_format = ROW
修改從庫配置(/etc/my.cnf)
增加以下內容
[mysqld]
# 啓用日誌(可選)
log-bin = mysql-bin
# 不可重複的序號
server-id = 2
# 日誌保存期限(可選)
expire_logs_days = 30
# 指定同步的數據庫(可選)
replicate-do-db = database
# 基於行紀錄,5.7.7及以後的版本默認是ROW
binlog_format = ROW
# 啓動複製的進程數
slave_parallel_workers = 4
# 基於組提交
slave_parallel_type = LOGICAL_CLOCK
master_info_repository = TABLE
relay_log_info_repository = TABLE
relay_log_recovery = ON
主從同步
從這裏纔開始進行同步過程,首先鎖定主庫只讀
flush tables with read lock;
備份主庫需要做同步的數據庫(如果主庫沒有數據的話此步可以省略)
mysqldump -h172.24.7.108 -P3306 -uroot -ppassword -B database > /home/backup.sql
-B: 導出的數據文件中已存在創建庫和使用庫的語句,不需要手動在原庫是創建庫的操作,在恢復過程中不需要手動建庫,可以直接還原恢復。
如果需要壓縮備份文件在語句最後增加 | gzip >/home/backup.gz
查看主庫bin-log偏移量並記錄
show master status;
解除只讀
unlock tables;
從庫導入備份的數據
mysql -uroot -ppassword < backup.sql
停止從庫slave進程
stop slave;
設置從庫同步信息
change master to master_host='172.24.7.108',master_port=3306,master_user='slave',master_password='1234509876',master_log_file='mysql-bin.000014',master_log_pos=73276696;
啓動同步
start slave;
查看同步狀態,等待紅框內兩項都變成Yes即爲同步成功
show slave status\G;
此後需要備份時只需要關閉主從連接,再對從庫進行備份即可。
從備份信息中恢復單個表數據
提取建表語句
sed -e'/./{H;$!d;}' -e 'x;/CREATE TABLE `user_online`/!d;q' backup.sql > user_online.sql
提取insert 語句(update同理)
grep -i 'INSERT INTO `user_online`' backup.sql > user_online.sql