MySQL主从复制

MySQL Alan 8年前 (2016-07-16) 10107次浏览 0个评论 扫描二维码

基于日志点的主从复制

在主服务器上创建用户

CREATE USER ‘repl’ @ ‘IP段’ IDENTIFIED BY ‘pass’;
GRANT REPLICATION SLAVE ON *.* TO ‘repl’ @ ‘IP段’
如本地测试网段为192.168.0.*时

配置主从数据库服务器

配置主数据库服务器(my.cnf)
bin_log = mysql-bin
server_id = 1 #值在集群中唯一
配置从服务器服务器
bin_log = mysql-bin
server_id = 2
relay_log = mysql-relay-bin
log_slave_update = on #可选
read_only = on #可选

具体配置如下(从库将server-id修改为2即可),配置完成重启MySQL服务

谨慎设置binlog_format=MIXED:如果你采用默认隔离级别REPEATABLE-READ,那么建议binlog_format=ROW。如果你是READ-COMMITTED隔离级别,binlog_format=MIXED和binlog_format=ROW效果是一样的,binlog记录的格式都是ROW,对主从复制来说是很安全的参数。

初始化从服务器数据

备份方法一:mysqldump –master-data=2 -single-transaction
备份方法二:xtrabackup –slave-info #对纯innodb更推荐
在主服务上进行备份

若出现类似如下报错,需将socket=/var/lib/mysql/mysql.sock的配置移到[client]中:

然后通过scp命令将all.sql文件传到从库上

scp all.sql root@192.168.0.7:/root
若scp命令不可用,则需安装yum install openssh-clients,也可通过ftp等方式复制该sql文件

在从服务器上导入数据

mysql -uroot -p < all.sql

启动复制链路
CHANGE MASTER TO MASTER_HOST = ‘master_host_ip’,
MASTER_USER = ‘repl’,
MASTER_PASSWORD = ‘pass’,
MASTER_LOG_FILE = ‘mysql_log_file_name’,
MASTER_LOG_POS = 4;
如MySQL端口并非默认的3306,需同时添加MASTER_PORT=***的设置,其中后面两段可能过more all.sql查看CHANGE MASTER TO…后面的内容,本例如下:

在从服务器MySQL命令行上通过先执行start slave再通过SHOW SLAVE STATUS可查看当前状态,还可在主从服务器上使用show processlist来查看进程
在执行show slave status时发现Got fatal error 1236…的报错,打开错误日志:

回到主服务器的MySQL命令行执行如下命令发现server_id为1,并没有问题

MySQL主从复制

最终发现由于在主服务器的my.cnf中将server-id=1配到[mysqld_safe]中去了,移入[mysqld]中重启MySQL服务错误消失。两条服务器中执行show processlist会发现都多出一有关主从交互的记录。

常用的一些配置

基于GTID的主从复制

GTID=source_id:transaction_id

基于GTID的主从复制仅从MySQL5.6开始进行支持(可使用SELECT VERSION()进行查询)。
在主数据库服务器上建立复制账号,方法与基于日志的方式相同

配置主从数据库服务器

配置主数据库服务器
log-bin=mysql-bin
server-id = 1
gtid_mode=on
enforce-gtid-consistency = on
log-slave-updates=on #5.7中无需启用

配置从数据库服务器
server-id = 2
relay_log=/var/lib/mysql/mysqld-relay-bin
gtid_mode=on
enforce-gtid-consistency
其它建议配置参数
read_only = on #从数据库
master_info_repository = TABLE
relay_log_info_repository = TABLE

初始化从服务器数据

备份方法一:mysqldump –master-data=2 -single-transaction
备份方法二:xtrabackup –slave-info #对纯innodb更推荐

启动基于GTID的复制

CHANGE MASTER TO MASTER_HOST = ‘master_host_ip’,
MASTER_USER = ‘repl’,
MASTER_PASSWORD = ‘pass’,
MASTER_AUTO_POSITION=1;

配置多线程主从复制

在从数据库中进行如下操作

MySQL主从复制
备注:
1.如果MySQL版本太低,需删除重新安装高版本来进行基于GTID的主从复制的测试

2.在从服务器上导入sql时出现报错
ERROR 1840 (HY000) at line 24: @@GLOBAL.GTID_PURGED can only be set when @@GLOBAL.GTID_EXECUTED is empty.
执行reset master然后在主服务器上重新dump一份sql文件
3.执行start slave时出现如下报错
ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
执行reset slave再启动start slave

4.启动MySQL时出现如下报错

其中第一个是Warning,可以忽略,也可在/etc/my.cnf中加入explicit_defaults_for_timestamp = 1来进行解决,第二个是ERROR,通知删除命令可以解决(虽然只是一些日志文件但也可以暂移动到其它文件夹下防止后面还需要查看)。

5.MASTER_AUTO_POSITION错误

执行change master to master_auto_position=0;即可

5.Error_code: 2003
a.查看密码是否正确
b.使用mysql -h 192.168.0.3 -u repl -p进行连接看是否可连接,若不可连接尝试关闭iptables(service iptables stop)再次连接,如可连接在/etc/sysconfig/iptables中添加一行

日志报错示例:

6.ERROR 1794 (HY000)
未有机会复制这一错误,无法明确解决的方法是什么,解决时采取的措施有:
在从服务器上reset master
yum remove mysql-mmm* -y
由于进行过主主的配置,所以主服务器做过从服务器,所以执行了
delete from mysql.slave_master_info;
reset master;
reset slave;
重新导出数据库,然后在从服务器上重启mysql服务

7.Nasty PTR record
这个是由于配置了DHCP动态分配IP的方式,只需将/etc/sysconfig/network-scripts/ifcfg-eth0中的配置修改为静态重启网络服务,然后删除.ssh/known_hosts中对应行再次连接即可

喜欢 (3)
[]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址