在主服务器上为从服务器创建一个用户:html
grant replication slave on *.* to '用户名'@'主机' identified by '密码';mysql
若是使用的是MySQL 4.0.2以前的版本,则用file权限来代替replication slaveweb
编辑主服务器的配置文件:/etc/my.cnfsql
server-id=1
log-bin
binlog-do-db=须要复制的数据库名,若是复制多个数据库,重复设置这个选项便可
binlog-ignore-db=不须要复制的数据库苦命,若是复制多个数据库,重复设置这个选项便可shell
注意:若是你想作一个复杂点的结构:好比说,A->B->C,其中B是A的从服务器,同时B又是C的主服务器,那么B服务器除了须要打开log-bin以外,还须要打开log-slave-updates选项,你能够再B上使用“show variables like 'log%';”来确认是否已经生效。数据库
编辑从服务器的配置文件:/etc/my.cnf服务器
server-id=2
master-host=主机
master-user=用户名
master-password=密码
master-port=端口
replicate-do-db=须要复制的数据库名,若是复制多个数据库,重复设置这个选项便可
replicate-ignore-db=须要复制的数据库名,若是复制多个数据库,重复设置这个选项便可app
配置主从服务器的my.cnf时,留心各自的server-id必定要彼此独立,不能重复,不然,会出现以下错误:ide
Slave: received end packet FROM server, apparent master shutdownthis
另外一个须要注意的是最好在从服务器的my.cnf里设置read_only选项,防止发生意外(链接用户不能有SUPER权限,不然无效)。
记得先手动同步一下主从服务器,数据量小的话能够用mysqldump,它有一个master-data参数颇有用,经过使用此参数,导出的SQL文件里会自动包含CHANGE MASTER TO MASTER_LOG_FILE='...', MASTER_LOG_POS=...;,这样建立从服务器就更方便了。
若是数据量大的话不太适合使用mysqldump(慢),若是是myisam表的话,加上--lock-all-tables参数,若是是innodb表的话,加上--single-transaction参数。
而应该采用拷贝文件的方式,请按以下操做步骤:
先在主服务器上锁定全部的表,以避免在复制过程当中数据发生变化:
mysql> flush tables with read lock;
而后在主服务器上查询当前二进制文件的文件名及偏移位置:
mysql > show master status;
而后中止主服务器上的MySQL服务:
shell> mysqladmin -u root shutdown
注意:若是仅是MyISAM的话,能够不中止MySQL服务,但要在复制数据文件的过程当中保持只读锁,若是是InnoDB的话,必须中止MySQL服务。
再拷贝数据文件:
shell> tar -cvf /tmp/mysql-snapshot.tar .
拷贝完别忘了启动主服务上的MySQL服务了。
而后把数据文件应用到从服务器上,再次启动slave的时候使用,记得启动时加上skip-slave-start选项,使之不会马上去链接master,再在从服务器上设置相关的二进制日志信息:
mysql> CHANGE MASTER TO
-> MASTER_HOST='master_host_name',
-> MASTER_USER='replication_user_name',
-> MASTER_PASSWORD='replication_password',
-> MASTER_LOG_FILE='recorded_log_file_name',
-> MASTER_LOG_POS=recorded_log_position;
启动从服务器上的复制线程:
mysql> start slave;
验证主从设置是否已经成功,能够输入以下命令:
mysql> show slave status\G
会获得相似下面的列表:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
若是这两个选项不全是Yes,那就说明你前面某个步骤配置错了。
应该保证从服务器上任何数据的修改都是经过从主服务器上复制操做获取的,换句话说,从服务器应该是只读的,若是不能保证这一点,则可能形成主从数据不一致。能够在从服务器的my.cnf里加入read-only参数来实现这一点,惟一须要注意的一点事read-only仅对没有super权限的用户有效。因此最好核对一下链接从服务器的用户,确保其没有super权限。
从理想角度看,主从数据库应该无端障的运转下去,能够有时候仍是会出现一些莫名其妙的问题,好比说即使从未在从服务器上手动更新过数据,但仍是可能遇到“Error: 1062 Duplicate entry”错误,具体缘由不详,多是MySQL自己的问题。遇到这类问题的时候,从服务器会中止复制操做,咱们只能手动解决问题,具体的操做步骤以下:
mysql> set global sql_slave_skip_counter = 1;
mysql> start slave;
一样的操做可能须要进行屡次,也能够设置自动处理此类操做,在从服务器的my.cnf里设置:
slave-skip-errors=1062
最后再唠叨一下日志的问题:时间长了,数据库服务器上的二进制文件会愈来愈多,清理是必要的,你能够设置自动清理,相关参数是expire_logs_days,也可使用手动删除的方式,但这里说的手动不是指rm,而是指PURGE BINARY LOGS,删除任何日志前,最好在全部的从服务器上经过show slave status命令确认一下相关日志是否已经无用。
更详细的介绍参考官方文档:How to Set Up Replication,不喜欢英文的话能够看老叶同志的中文翻译。
补充:[ERROR] Error in Log_event::read_log_event(): 'Event too big'
在使用主从复制的时候,出现的问题多半是和日志(主服务器的二进制日志,从服务器的延迟日志)相关的。好比说加入你遇到了上面的错误,你能够根据错误日志的信息在主从数据库服务器上分别执行:
mysqlbinlog 日志文件 > /dev/null
查看错误,若是没有错误,则不会有任何输出,反之会输出错误信息,若是肯定了错误是出如今主服务器二进制日志上,能够跳过适当的位置,再在从服务器上从新设定LOG_POS,若是肯定了错误是出如今从服务器延迟日志上,则能够删除从服务器的延迟日志(使用CHANGE TO MASTER的时候,除非设定了延迟日志信息,不然会自动删除延迟日志),并在从服务器上从新设定LOG_POS。期间也能够考虑手动执行不能自动执行的SQL日志。
补充:配置的时候若是版本容许最好打开sync_binlog选项。
补充:有时候,从服务器延迟日志可能已经损坏,这时须要执行CHANGE MASTER TO设置新的日志文件信息,可是在从服务器上SHOW SLAVE STATUS会显示不少日志信息,他们的含义有所不一样:
Master_Log_File:Read_Master_Log_Pos 是IO相关的日志信息
Relay_Master_Log_File:Exec_Master_Log_Pos 是SQL相关的日志信息
从服务器须要设置的是SQL相关的日志信息:
slave stop;
change master to master_log_file=’(binlog name in relay_master_log_file)’, master_log_pos=(exec_master_log_pos number);
slave start;
1) When you are using the master as a consistent snapshot, use SHOW MASTER STATUS to determine the position.
2) When you are using a slave as a consistent snapshot, use SHOW SLAVE STATUS and Exec_Master_Log_Pos.
参考连接
补充:缺省状况下,从服务器会以主机名命名延迟日志,因此一旦你修改了从服务器的主机名就会形成问题,新版MySQL会提示你这个状况:
[Warning] Neither --relay-log nor --relay-log-index were used;
so replication may break when this MySQL server acts as a slave and has his hostname changed!!
Please use '--relay-log=name-relay-bin' to avoid this problem.