MySQL 同步和主从设置

红薯 发布于 2010/08/11 11:13
阅读 3K+
收藏 9

关于 MySQL 主从复制的配置,网络上可以搜出成筐的文章来,但下面这篇写得很清晰、简洁,值得推荐:

以下文章内容转自阿权的书房

设置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 表结构修改如果返回错误,则也会导致同步停止

加载中
0
Stefan555
Stefan555

主从设置---->读写分离---->使用数据库反向代理

对于数据库write-heavy的站点来说,仅仅采用主从和读写分离还远远不都哦,此时我们考虑垂直分区(即我们将不同的数据库转移到独立的数据库服务器上),如果还是不能承受呢(压力太大),考虑水平分区吧(使用映射关系分区)  有兴趣的话可以研究一下分区反向代理

 

0
范堡
范堡

哟哟哟.从 Mysql 5.5.x 开始,设置就有区别了,原来从数据库在 my.cnf 上的配置,变为了命令行输入。

稍后我写个文章说说

返回顶部
顶部