应用场景
因为原有生产的数据是使用的windows系统,另一个项目因为考虑到后续需要升级其他的新的技术,决定采用linux系统,那么需要保持数据的实时性,决定做数据库主从。主:windows系统,从:linux系统
测试:主的mysql版本是8.0.26 从:mysql版本是8.0.28linux版本
配置主从
1.停掉主库,配置主数据库my.cnf配置文件,重启主库
#server-id主从必须保持不一致
server-id=235
log-bin=mysql_bin
#window下的安装路径
relay_log="D:\mysql-8.0.26-winx64"
auto-increment-increment=2
auto-increment-offset=1
log-slave-updates=1
# 允许mysql创建函数
log-bin-trust-function-creators=1
说明:在主主同步配置时,需要将两台服务器的auto_increment_increment增长量都配置为2,代表主主数据库的总台数。而要把auto_increment_offset分别配置为1和2,需要同步的数据库auto_increment_offset参数不能相同,这样才可以避免两台服务器同时做更新时自增长字段的值之间发生冲突。
2.停掉从库,配置从库my.cnf配置文件,然后重启从库
log_bin = mysql-bin
server_id = 231
#relay_log可以不用配置,使用默认的就可以
#relay_log = "C:\ProgramData\MySQL"
log_slave_updates = 1
read_only = 0
# 允许mysql创建函数=
log-bin-trust-function-creators=1
#因为同步的数据名称不一样
replicate-rewrite-db = ywtg_new -> ywtg
#指定同步的表
replicate-wild-do-table = ywtg.md_spgl_spys_city
replicate-wild-do-table = ywtg.md_spgl_xmspsxblxxxxb_city
3.在主库、从库中创建同步账号
CREATE USER 'repl'@'%' IDENTIFIED BY 'augur@123';
flush privileges;
grant replication slave,replication client on *.* to 'repl'@'%' WITH GRANT OPTION;
flush privileges;
\
4.使用root账号登录到主库,通过 show master status; 查看file和position,很重要,在从库中配置会用到
\
5.使用root账号登录到从库中,执行一下命令
change master to master_host='a库的IP地址',
master_user='repl',(刚才在a库创建的新账号)
master_password='augur@123',(新账号的密码)
master_log_file='mysql-bin.000003',(步骤5的File名称)
master_log_pos=6913(步骤5的Position)
6.执行完第5步之后,执行START SLAVE; 命令
7.查看同步的状态,如果slave_io_running,slave_sql_running都是yes,那么说明配置成功了
8.在主库中进行数据测试,如果主库中的数据修改,从库中的数据也进行了修改,说明两者同步成功了\
在同步中同步失败可能遇到的问题
1。如果slave_sql_running为no,则可能同步出现错误,需要手动执行一次start slave同步操作,再重新查看SHOW SLAVE STATUS\G是否配置成功。在做同步之前尽量让a库跟b库的结构相同。
2如果出现slave_io_running=no,检查操作6中的是否配置错误,也可能网络不通原因。
3当mysql数据库一直存在数据变动,则同步很难完成,因为master的position一直在变动,需要先进入主库,进行锁表,防止数据写入:sql> flush tables with read lock; 同步设置完成后在执行:sql>unlock table;
4若发生断电,同步出现错误,slave_sql_running为no,则在故障的位置重新配置同步。操作如下(执行show slave status\g操作,下列的其中MASTER_LOG_FILE=为Relay_Master_Log_File,MASTER_LOG_POS为Exec_Master_Log_Pos再执行一次同步操作)
stop slave;
change master to Master_Log_File='mysql_bin.000005', Master_Log_Pos=415;
start slave;
show slave status\g;
//如果slave_sql_running为no则再执行一次start slave即可同步成功