公司的生产mysql已经运行很久了,最近打算把公司的生产库做个主从复制以达到备份数据的效果;
简单说下步骤:
一:将现有生产库备份一下,可用图形化工具导出数据库表和数据,或者使用命令来将数据库导出,命令方式如下:
理论应该使用:FLUSH TABLES WITH READ LOCK 导出之前应该将表锁定;以确保在导出数据过程中产生新的数据
查看主库状态:show master status;
通过命令mysqldump -u username -p database >文件名.sql
将数据导出备份成功之后再回到主库并执行:UNLOCK TABLES以解锁主库,
不过此处由于工作一直在进行中且只有一个生产库所以不做锁库操作,直接进行数据备份
这样的坏处在于还原备份数据的时候,开启binLog同步可能会和主库之间有部分数据丢失;
这部分暂时可以考虑弥补之法,从备份之前查询一次主库状态show master status查看当前log记录位置,
备份好slave之后,开启数据自动同步之前再查一次主库状态show master status查看当前log记录位置,则两个log位置之间的差值
即为两个数据库数据的不同步部分,这些数据可补偿方式可以继续研究……
二:查看主库状态show master status,将其中的数据和下面的进行替换
change master to master_host='ipaddr',master_user='root',master_password='password',
master_log_file='主库的File',master_log_pos=793402911;
start slave;开始执行同步
SHOW SLAVE STATUS;查看从库同步主库状态
只有这两个都为Yes时则同步数据正常;否则查看Last_error定位具体原因;
Last_SQL_Error: Could not execute Update_rows_v1 event on table buy_online.tp_coupon_list; Can't find record in 'tp_coupon_list', Error_code: 1032;
handler error HA_ERR_KEY_NOT_FOUND; the event's master log mysql-bin.001937, end_log_pos 1489688
当出现这个错误时,查看具体错误原因,如需要跳过此类错误则:
并重启数据库,然后start salve;
此时再SHOW SLAVE STATUS则发现同步正常了。
强调:1032的错误本身对数据一致性没什么影响,影响最大的是造成了同步失败、同步停止。
至于主库和从库的配置,如下:
vi /etc/my.cnf 新增以下内容
server_id=1 ###服务器id这个数字没有限制,不要在同一个集群环境中相同就行
log-bin=mysql-bin ###开启日志文件
重启mysql服务 service mysqld restart
验证是否已经配置成功
show variables like '%server_id%';
能够查询对应配置文件中的server_id 说明已经配置成功
show master status;
能够看到同步的文件,和行数 说明已经配置成功。
从库配置:
vi /etc/my.cnf
server_id=2 ###从服务器server_id
log-bin=mysql-bin ###日志文件同步方式
binlog_do_db=test ###同步数据库
重启mysql服务 service mysqld restart
验证是否已经配置成功
show variables like '%server_id%';
能够查询对应配置文件中的server_id 说明已经配置成功
start slave:注意在开启主从同步的时候,如果报错
Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.
datadir目录下查看auto.cnf,是否和主库重复,修改或删掉从节点此文件都行。