业务需要,正好自己从来没有接触过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;

最终效果如下

MySQL 从库1062 解决方案_mysql

修改主库配置(/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;

MySQL 从库1062 解决方案_mysql_02


解除只读

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;

MySQL 从库1062 解决方案_数据库_03


MySQL 从库1062 解决方案_mysql_04


此后需要备份时只需要关闭主从连接,再对从库进行备份即可。

从备份信息中恢复单个表数据

提取建表语句

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