mysql主从同步定义
主从同步使得数据可以从一个数据库服务器复制到其他服务器上,在复制数据时,一个服务器充当主服务器(master),其余的服务器充当从服务器(slave)。因为复制是异步进行的,所以从服务器不需要一直连接着主服务器,从服务器甚至可以通过拨号断断续续地连接主服务器。通过配置文件,可以指定复制所有的数据库,某个数据库,甚至是某个数据库上的某个表。
配置主从同步
如果不是一开始就部署的主从,那么后面最好把主库的数据先同步一份到从库上,以免后面各种报错.其中下面介绍的slave-skip-errors=1032
就是我遇到的,从库数据缺失的时候报的record not exist.
同步数据的时候可以先给master库上锁
#登录数据库后刷新所有的表,同时给数据库加上一把锁,阻止对数据库进行任何的写操作
flush tables with read lock;
然后开始巴拉巴拉同步数据.
比如sqldump导出数据
不压缩
mysqldump -uroot -p'123456' -S /data/3306/data/mysql.sock --all-databases > /server/backup/mysql_bak.$(date +%F).sql
压缩
mysqldump -uroot -p'123456' -S /data/3306/data/mysql.sock --all-databases | gzip > /server/backup/mysql_bak.$(date +%F).sql.gz
同步完了记得解锁
unlock tables;
在主服务器上,必须开启二进制日志机制和配置一个独立的ID
[mysqld]
log_bin = mysql-bin
server_id = 2
#binlog-do-db指定主库的哪一个数据库,不添加这行表示同步所有,多个库可以用逗号分隔
binlog-do-db=xxx-xxx-prod
#这是不记录binlog,来达到从库不同步mysql库,以确保各自权限.忽略多个库也可以用逗号分隔
binlog-ignore-db = mysql
然后在主库上创建一个只能进行主从同步的账号
demo,创建账号的说明在我另一篇博文中有提及
grant replication slave on *.* to ‘userName’@‘%’ identified by ‘password’;
在开始复制进程前,在主服务器上记录二进制文件的位置信息
登录mysql或者navicat连上mysql后
show master status
在每一个从服务器上,配置一个唯一的ID,创建一个用来专门复制主服务器数据的账号
[mysqld]
#server_id必需和主库的不一样
server_id = 3
#设定从库的哪一个数据库需要复制主库的数据(多数据库使用逗号,隔开)
replicate-do-db = xxx-xxx-slave
#指定master的哪个数据库到slave的哪一个数据库
replicate-rewrite-db = xxx-xxx-prod -> xxx-xxx-slave
#从库同步的时候可能会报一些record不存在等错误,这边可以选择跳过此类错误
slave-skip-errors=1032
我这边因为是主库和从库不是同一个所以指定了,这里slave端还有其他参数
#设定从库的哪一个数据库需要复制主库的数据(多数据库使用逗号,隔开)
replicate-do-db
#设定需要忽略的复制数据库 (多数据库使用逗号,隔开)
replicate-ignore-db
#设定需要复制的表
replicate-do-table
#设定需要忽略的复制表
replicate-ignore-table
#同replication-do-table功能一样,但是可以通配符.
#demo---->replicate-wild-do-table=db_name.% 只复制哪个库的哪个表
replicate-wild-do-table
#同replication-ignore-table功能一样,但是可以加通配符
#demo---->replicate-wild-ignore-table=mysql.% 忽略哪个库的哪个表
replicate-wild-ignore-table
从库需要导入数据的话就可以导入了
比如.sql文件导入
mysql -uroot -p'123456' -S /data/3306/data/mysql.sock < /server/backup/mysql_bak.2015-07-01.sql
数据导入完后开始配置同步参数,登陆mysql,输入如下信息:
CHANGE MASTER TO
MASTER_HOST='master_host_name',
MASTER_PORT=3306,
MASTER_USER='replication_user_name',
MASTER_PASSWORD='replication_password',
MASTER_LOG_FILE='recorded_log_file_name',
启动主从同步进程
start slave;
停止主从同步进程
stop slave;
检查状态
show slave status \G
下面的两个进程都显示YES则表示配置成功
加入从库同步的时候报错了,这个时候可以手动操作一下跳过这个报错
#先停止slave的线程
stop slave;
#跳过几个错误,这里写的是跳过1个错误
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
#启动从库同步线程
start slave;
观察slave_sql_Runing是否为YES
show slave status;
从slave服务器上备份数据
首先暂停从服务器的复制进程
mysqladmin stop-slave
或者只是暂停SQL进程(从服务器仍然能接收二进制日志的事件,但不会执行这些事件,这样能在重启SQL进程时加快复制进度)
mysql -e ‘stop slave sql_thread;’
使用mysqldump导出全部或部分的数据库
mysqldump --all-databases > fulldb.dump
在导出数据库后,重启复制进程
mysqladmin start-slave