设置Mysql的主从设置很重要,有如下几点用处:
1 做备份机器,一旦主服务器崩溃,可以直接启用从服务器作为主服务器
2 可以直接锁定从服务器的表只读,然后做备份数据,这样不会影响主服务器的服务
3 可以处理读写数据库的负载均衡
阿权总结的设置主从的要点有如下:
1 主从服务器的启动方式的不同点
2 主服务器只读或者停止服务然后获取当前数据快照,清理日志或者重新开始记录日志
3 从服务器一般需要只读,否则容易产生错误导致同步失败
阿权制作主从的过程总结:
1 停止数据库服务,并且删除当前的所有mysql日志(默认是mysql-bin.*)
2 把当前的所有数据库打包,备用
3 打包完成后,主服务器可以启动了
4 把从服务器的同步日志删除(默认是mysql-relay-bin.*)
5 把文件解压到从服务器的数据目录
6 设置好cnf文件,启动即可
当然,取得快照的方法还有别的:
1 FLUSH TABLES WITH READ LOCK 锁定所有表
2 打包文件或者是直接导出数据,比停止服务好的地方就是有一段读数据库的时间
3 然后 unlock tables
主从的配置区别:
启动方式请参考《 Mysql多实例启动》
主服务器没有设置 master的值,下面的参数影响同步:
#设定不同步的数据库,这些库的修改不会记录到日志,可以添加多行
binlog-ignore-db = test
#设定记录的库,可以添加多行
binlog-do-db = vnet
从服务器设置了系列master的参数:
master-host = 192.168.1.147
master-port = 3308
master-user = usr
master-password = pwd
master-retry-count = 999
master-connect-retry = 60
#并且可以设置忽略的库,可以添加多行
replicate-ignore-db = testdb
#设置仅处理的库,可以添加多行
replicate-do-db = aslibra
设置忽略的和处理的参数的一个就好,如果需要忽略哪些,就加上忽略的库,如果仅仅需要处理一两个,那就加上do-db的设置吧
如何检查同步情况?
show master status;
show slave status;
这里会列出当前同步的情况,包括同步哪些库,忽略哪些库
如何检查发生同步错误?
1 主服务器更新后没有反映在从服务器,这个是看的到的
2 可以使用phpmyadmin看进程或者是命令 SHOW PROCESSLIST
主服务器会有一条slave用户的记录,比如
slave 127.0.0.1:42157 无 Binlog Dump 598 Has sent all binlog to slave; waiting for binlog to be updated ---
从服务器会有两条记录
system user 无 Connect 724 Waiting for master to send event ---
system user 无 Connect 187 Has read all relay log; waiting for the slave I/O thread to update it ---
如果同步失败,则后一条没有
同步特性及已知问题
跨库的操作是不更新的,比如
update dbtest.aslibra set domain='www.aslibra.com' where id=5
更多内容可以参考《 同步特性及已知问题》,这里就不详细列出了啦
哪些从服务器操作会导致错误?
1 删除表或者修改表结构会导致之后更新该表产生错误,可以恢复原先结构再继续同步就可以,错误如下
080503 4:41:03 [Note] Slave SQL thread initialized, starting replication in log 'mysql-bin.000003' at position 244, relay log '/Data/mysql3309/var/mysql-relay-bin.000004' position: 381080503 4:44:00 [ERROR] Slave: Error 'Can't DROP 'id'; check that column/key exists' on query. Default database: 'dbtest'. Query: 'ALTER TABLE test DROP id', Error_code: 1091080503 4:44:00 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'mysql-bin.000004' position 252
2 从服务器如果写入一条记录,自增字段加一,主键唯一性错误,这样主服务器就无法同步这样的数据,导致同步停止。如果不产生主键冲突的数据是不会有影响
INTO aslibra (id, ddd) VALUES ('', '2008-05-02')', Error_code: 1062
080503 4:36:44 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'mysql-bin.000003' position 244
3 从服务器删除某条数据,主服务器再删除该条数据,不会产生错误
阿权的总结:
1 从服务器如果需要重新做同步数据,必须是主服务器开始记录日志的数据快照。所以快照很重要,可以用该快照立刻构建一个从服务器。
2 日志只是记录sql语句,执行删除和更新如果与主服务器数据不同是不会产生错误
3 如果执行插入数据,产生主键冲突则会导致错误,停止同步,除非从服务器执行本语句正常,则可以继续同步
4 表结构修改如果返回错误,则也会导致同步停止
原创内容如转载请注明:来自 阿权的书房
本帖地址: http://www.aslibra.com/blog/read.php/1039.htm