生产环境部署过的二种mysql同步: binlog和gtid

发布时间 2023-12-21 09:55:21作者: 天海沙

生产环境部署过的二种mysql同步: binlog和gtid

服务器A: 192.168.21.33 | master | winserver2019

服务器B: 192.168.21.40 | slave  | winserver2019

Mysql版本: 8.0.34.0

数据库连接软件: mysql-workbench-community-8.0.30-winx64

(注: linux版本一样的配置方法, 注意my.ini和my.cnf中的配置参数)


===biglog方式同步===========================================

1. 安装mysql8

2. mysql的Master端my.ini配置如下

[mysqld]
##设置server_id,同一局域网中需要唯一
server_id=33

##开启二进制日志功能,文件名指定为baiinfo-mysql-bin
log-bin=baiinfo-mysql-bin

##指定不需要备份的数据库名,如备份多个数据库,重复这个选项
binlog-ignore-db=mysql
binlog-ignore-db=performance_schema
binlog-ignore-db=information_schema
binlog-ignore-db=sys

##指定需要复制的数据库名为test,如果备份多个数据库,重复设置这个选项即可
##官方文档推荐在master端不指定binlog-do-db,在slave端用replication-do-db来过滤
#binlog-do-db=test

##设置使用的二进制日志格式(mixed,statement,row),不要使用mix
binlog_format=row

##最小化日志记录
binlog_row_image=minimal

##从库开启binlog日志记录,从服务器上的更改也会被写入主服务器的二进制日志中
log-slave-updates=1

##配置二进制日志自动删除/过期时间,单位秒,默认值为2592000,即30天
binlog_expire_logs_seconds=2592000

##跳过主从复制中遇到的所有错误或指定类型的错误,避免slaves端复制中断
##如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
replica_skip_errors=all


3. 配置master服务器的备份专用帐号和密码

--创建用户名/密码: slave/H8UAaO#$AfQeTiqo
create user 'slave'@'%' identified by 'H8UAaO#$AfQeTiqo';
--赋予备份权限,需要指定登陆来源ip的, 改'slave'@'%'为'slave'@'192.168.21.40'
grant all on *.* to 'slave'@'%';
--刷新使生效
flush privileges;
--查看一下用户状态确认正确
use mysql;
select Host,User from user;
--为Master服务器设置只读锁, 完成同步配置后记得解锁"unlock tables;"
Flush tables with read lock;

4. 将Master数据导出, 导入到Slave服务器, 数据必须保持一模一样!

  (略)

5. mysql的slave服务器my.ini配置如下:

[mysqld]
##从服务器 ID
server_id=40

##开启二进制日志功能,文件名指定为baiinfo-mysql-bin
log-bin=baiinfo-mysql-bin

##设置使用的二进制日志格式(mixed,statement,row),不要使用mix
binlog_format=row

##最小化日志记录
binlog_row_image=minimal

##配置二进制日志自动删除/过期时间,单位秒,默认值为2592000,即30天
binlog_expire_logs_seconds=2592000

##跳过主从复制中遇到的所有错误或指定类型的错误,避免slaves端复制中断
##如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
replica_skip_errors=all

# 设置不需要同步的数据库
replicate_wild_ignore_table=mysql.%
replicate_wild_ignore_table=performance_schema.%
replicate_wild_ignore_table=information_schema.%

# 指定需要做同步的数据库
replicate-do-db=oversea_bigdata
replicate-do-db=nacos_config
replicate-do-db=meeting_exhibition
replicate-do-db=iron_steel_data
replicate-do-db=economic_strategy
replicate-do-db=coop
replicate-do-db=bi_web_site
replicate-do-db=bi_app_visiting_assistants
replicate-do-db=xxl_job

##relay_log配置中继日志 
relay_log=baiinfo-relay-bin  

##mysql-slave将复制事件写进自己的二进制日志
log_replica_updates=ON

##防止改变数据(只读操作,除了特殊的线程)
read_only=ON


6. 设置主服务器链接ip用户名密码和binlog日志的文件名和当前日志点位

--先通过命令查询Master服务器, 获取File和Position参数
show master status;
--进入slave服务器中, 配置与主库的关联(logfilet和pos值,在master服务器上使用命令"show master status;"查询)
CHANGE MASTER TO MASTER_HOST='192.168.21.33',MASTER_PORT=3306, MASTER_USER='slave', MASTER_PASSWORD='baiinfo', MASTER_LOG_FILE='BAIINFO-APPDB06-bin.000004',MASTER_LOG_POS=776058804;
--回到Master服务器解除只读锁
unlock tables;
--在slave服务器上启动同步, 停止和查看同步状态
start slave;
stop slave;
show slave status \G;
--查看slave服务器状态
show slave status;
--->结果: Slave_IO_Running:'Yes' 和 Slave_IO_Running:'Yes' 则同步正常, 否则异常查看日志排查错误.


7. 配置过程中的一些问题
  1).mysql安装目录非默认时, 安装完成后启动mysql时会报"Mysql:ibdata1 Can‘t determine file permissions........"的错误
    解决方法:
      需要给\bin目录权限, 把NETWORK SERVICE添加到Administrators组, 才能正常启动mysql.
  2).修改my.ini文件后mysql无法启动
    解决方法:
      打开 my.ini文件另存为ANSI格式-覆盖-确定, 启动mysql, 解决!
  3).同步过程中的报错提示:
      Slave_IO_Running: No # 表示主服务器未成功读取
      Slave_SQL_Running: No # 表示slave不同步
      Slave_IO_Running: Connecting IP #与master连接有问题, 比如用户名或密码错误, 比如之前配置指定过master信息需要清除等等

 

===gtid方式同步===========================================================

1. 在以上biglog同步方式配置成功的基础上, 按如下配置稍做修改就可以转换成gtid方式同步

2. 修改Master端my.ini打开GTID模式, 配置如下:

# 增加打开gtid模式的配置
[mysqld]
gtid_mode=ON
enforce_gtid_consistency=1
-- 重启mysql服务后,可以用如下命令查询gtid是否打开成功"on"
SHOW GLOBAL VARIABLES LIKE 'gtid_mode'

3. 在slave上设置主服务器链接, (执行change master命令时注意mysql8.x版本的语法和配置命令):

-- 需要先停掉同步
stop slave;
stop replica;
-- 清空之前指定的master配置信息
change master to master_auto_position=0;
CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.21.33', SOURCE_USER='slave',SOURCE_PASSWORD='baiinfo', SOURCE_LOG_FILE='BAIINFO-APPDB06-bin.000012', SOURCE_LOG_POS=157;
-- 重新启动配置
start replica;
start slave;

#查看slave服务器状态

show slave status;
--->结果: Slave_IO_Running:'Yes' 和 Slave_IO_Running:'Yes' 则同步正常, 否则异常查看日志排查错误.

5. 同步检查常用命令
  SHOW GLOBAL VARIABLES LIKE 'gtid_mode'
  show slave status;
  show master status;
  show replica status;
  start slave;
  stop slave;
  start replica;
  stop replica;
  show global variables like 'slave_parallel_%';


8. MySQL常用的一些操作命令:
    mysql -u root -p   #进入mysql数据库
    ALTER user 'root'@'localhost' IDENTIFIED BY '1+1=2?Yes'; #修改初始密码
    CREATE DATABASE 数据库名称;   #创建新的数据库
    DROP DATABASE 数据库名称;   #删除数据库
    USE 数据库名称;  #指定使用的数据库
    DESCRIBE 表单名称;  #显示表结构
    SHOW databases;  #显示当前已有的数据库
    SHOW tables;   #显示当前数据库中的表单
    UPDATE 表单名称 SET attribute=新值 WHERE attribute>原始值;   #更新表单中的数据
    SELECT * FROM 表单名称;   #从表单中选中某个记录值
    DELETE FROM 表单名 WHERE attribute=值;   #从表单中删除某个记录值
    INSERT INTO mybook(name,price,pages) VALUES('linuxprobe','60', '518') ;   #插入值
    mysqldump -u root -p myDBName > /root/myDB.dump  #备份数据库
    mysqldump --single-transaction -u root -h 192.168.10.35 --password='password' -p myDBName > /root/myDB.sql  #指定密码备份数据库
    mysql -u root -p myDBName < /root/myDB.sql  #手动输密码,还原数据库,安全
    mysql -u root --password=password myDBName < /root/myDB.sql  #指定密码,自动还原数据库,不安全
    开通mysql外部访问权限:
     use mysql;
     update user set host="%" where user="root"; # 所有机器都能访问root用户
     flush privileges; # 重新加载权限
     show grants for '用户名'@'%';  #查看某用户名权限
    主从同步:
     start replica;
     stop replica;
     show replica status;
     show slave status \G;