摘要:MySQL主从复制与主主复制 主从复制: 1.环境说明: 准备两台linux虚拟主机 Linux版本CentOS7、MySQL 5.7.17 ip:192.168.1.1、192.168.1.2 2.创建复制账号 mysql会赋予一些特殊的权限给复制线程,在备库运行的I/O线程会建立一个到主库TCP/IP连接,这意味着必须在主库创建一个用户,并赋予其合适的权限
主从复制:
1.环境说明:准备两台linux虚拟主机
Linux版本CentOS7、MySQL 5.7.17
ip:192.168.1.1、192.168.1.2
2.创建复制账号
mysql会赋予一些特殊的权限给复制线程,在备库运行的I/O线程会建立一个到主库TCP/IP连接,这意味着必须在主库创建一个用户,并赋予其合适的权限,备库I/O线程以该用户名连接到主库并取其二进制日志;(摘自:高性能mysql => 复制)
在192.168.1.1 中创建一个192.168.1.2主机中可以登录的MySQL用户
//192.168.1.1 : 主数据库服务器:
mysql>GRANT REPLICATION SLAVE ON *.* TO \'tongbu\'@\'192.168.1.2\' IDENTIFIED BY \'tongbu\'; mysql>FLUSH PRIVILEGES;
注意1:这里我把这个账号限制在本地并且只有192.168.1.2这个主机可以访问,因为这是一个特殊权限的账号(尽管这个账号无法执行select或者update),但是任然能从二进制日志中获取一些数据(摘自:高性能mysql => 复制)
3.配置主库和备库MySQL配置文件都在: /etc/my.cnf
1.在主库的my.cnf文件的[mysqld]下添加:log-bin,server_id(具体如下:)log-bin=mysql-bin # 开启二进制日志 server_id=10 # 0-232任取 但必须和其他数据库中的不同 (必须唯一)!
注意:二进制日志必须开启,因为数据的同步实质上就是其他的MySQL数据库服务器将这个数据变更的二进制日志在本机上再执行一遍。
2.保存后重启mysql 3.查看主库中MySQL服务器二进制文件名与位置mysql>SHOW MASTER STATUS;
注意:这里重点关注File和Position这两项;
4.告知二进制文件名与位置在备库中执行:
mysql>CHANGE MASTER TO >MASTER_HOST=\'192.168.1.1\', >MASTER_USER=\'tongbu\', >MASTER_PASSWORD=\'tongbu\', >MASTER_LOG_FILE=\'mysql-bin.000001\', >MASTER_LOG_POS=98;
完成主从复制配置
5.开启并查看在备库中执行:
mysql>START SLAVE; #开启复制 mysql>SHOW SLAVE STATUSG #查看主从复制是否配置成功
注意:当看到Slave_IO_Running: YES、Slave_SQL_Running: YES才表明状态正常(如有异常请看3.关于报错中提供的解决方案!)
主主复制:
1.设置配置文件(参考上面)–192.168.1.1
server-id=11 #任意自然数n,只要保证两台MySQL主机不重复就可以了。 log-bin=mysql-bin #开启二进制日志 auto_increment_increment=2 #步进值auto_imcrement。一般有n台主MySQL就填n auto_increment_offset=1 #起始值。一般填第n台主MySQL。此时为第一台主MySQL binlog-ignore=mysql #忽略mysql库【我一般都不写】 binlog-ignore=information_schema #忽略information_schema库【我一般都不写】 replicate-do-db=aa #要同步的数据库,默认所有库
–192.168.1.2
server-id=12 log-bin=mysql-bin auto_increment_increment=2 auto_increment_offset=2 replicate-do-db=aa
配置好后重启MySQL
2.创建复制账号并配置二进制文件名与位置第一步:
在192.168.1.1中创建一个192.168.1.2主机中可以登录的MySQL用户
mysql>GRANT REPLICATION SLAVE ON *.* TO \'root\'@\'192.168.1.2\' IDENTIFIED BY \'root\'; mysql>FLUSH PRIVILEGES;
第二步:
在192.168.1.1查看二进制日志名和位置
mysql>show master status;
在192.168.1.2中执行:
mysql>CHANGE MASTER TO >MASTER_HOST=\'192.168.1.1\', >MASTER_USER=\'root\', >MASTER_PASSWORD=\'root\', >MASTER_LOG_FILE=\'mysql-bin.000001\', >MASTER_LOG_POS=98;
第三步:
在192.168.1.2中创建一个192.168.1.1主机中可以登录的MySQL用户
mysql>GRANT REPLICATION SLAVE ON *.* TO \'root\'@\'192.168.1.1\' IDENTIFIED BY \'root\'; mysql>FLUSH PRIVILEGES;
第四步:
在192.168.1.2查看二进制日志名和位置
mysql>show master status;
在192.168.1.1中执行:
mysql>CHANGE MASTER TO >MASTER_HOST=\'192.168.1.2\', >MASTER_USER=\'root\', >MASTER_PASSWORD=\'root\', >MASTER_LOG_FILE=\'mysql-bin.000001\', >MASTER_LOG_POS=98; 3.完成mysql主主复制
分别开启START SLAVE;
mysql>START SLAVE; #开启复制 mysql>SHOW SLAVE STATUSG #查看主从复制是否配置成功
注意:当看到两台主机的Slave_IO_Running: YES、Slave_SQL_Running: YES才表明状态正常
3.关于报错1.主从同步报错Fatal error: The slave I/O thread stops because master and slave have equal MySQL server
原因分析:
mysql 5.6的复制引入了uuid的概念,各个复制结构中的server_uuid得保证不一样,但是查看到直接copy data文件夹后server_uuid是相同的,show variables like ‘%server_uuid%’;
解决方法:
找到data文件夹下的auto.cnf文件,修改里面的uuid值,保证各个db的uuid不一样,重启db即可
场景二:创建主从关系时copy了同样的my.cnf文件,报错
Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids;
原因分析:
和server_uuid类似,servier_id也得保证不一样
解决方法:
找到my.cnf配置文件中的server_id,修改从库的server_id保证和复制结构中的其他db不一样,重启db即可
1、主主复制配置文件中auto_increment_increment和auto_increment_offset只能保证主键不重复,却不能保证主键有序。
2、当配置完成Slave_IO_Running、Slave_SQL_Running不全为YES时,show slave statusG信息中有错误提示,可根据错误提示进行更正。
3、Slave_IO_Running、Slave_SQL_Running不全为YES时,大多数问题都是数据不统一导致。
常见出错点:
1、两台数据库都存在db数据库,而第一台MySQL db中有tab1,第二台MySQL db中没有tab1,那肯定不能成功。
2、已经获取了数据的二进制日志名和位置,又进行了数据操作,导致POS发生变更。在配置CHANGE MASTER时还是用到之前的POS。
3、stop slave后,数据变更,再start slave。出错。
终极更正法:重新执行一遍CHANGE MASTER就好了。
相关文章推荐
虚拟主机的专业参数,分别都是什么意思?2022-09-09
中非域名注册规则是怎样的?注册域名有什么用处? 2022-01-10
HostEase新年活动促销 美国/香港主机全场低至五折2021-12-28
HostGator下载完整备份教程分享2021-12-28
Flink中有界数据与无界数据的示例分析2021-12-28