广告位招租 联系qq:165345322

【翻译】MYSQL数据库复制

时间:2007-01-04 09:48:49   来源:  作者:whsong  点击:次  出处:技术无忧
关键字:【翻

MySQL 的数据库复制
尽量确保所安装的MySQL版本是最新版本
4.1.x和4.0.x是相同的binary log format,所以他们中的任意两个复制都不会有问题
下面给出了一个兼容性列表:
Master
3.23.33 and up Master
4.0.3 and up or any 4.1.x Master
5.0.0
Slave 3.23.33 and up yes no no
Slave 4.0.3 and up yes yes no
Slave 5.0.0 yes yes yes
1. 在Master Server上建立一个用于Slave Server同步数据库用的帐号,这个帐号要被给予“REPLICATION SLAVE”权限,假设你的Slave Server所在的域为Slave.com,同步用用户名为repl,密码为slavepass,用如下语句在Master Server上建立用户并授权:
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.Slave.com' IDENTIFIED BY 'slavepass'; //这允许复制所有的数据库,也可以单独制定数据库
2. 如果数据库只是用了MyISAM表(从3.23.0开始,MyISAM就是MySQL数据表的默认格式了),用“FLUSH TABLES WITH READ LOCK;”语句刷新所有的表并禁止写语句。不要退出你执行上述语句的客户端,如果退出,语句执行就会结束。
3. 为Master Server上的数据做一个快照,最简单的办法就是把数据目录打成一个压缩包。Linux下使用tar命令,Windows下可以使用WinRAR。如果只复制单个数据库就只需打包那个数据库目录就可以了。将打包文件拷贝到Slave Server上,解压缩到数据库目录,如果不想Slave Server上的mysql数据库被覆盖,将压缩包里面的mysql剔除再解压缩到数据库目录。压缩包解压缩前不要包含任何日志文件,或者master.info、relay-log.info。
4. 当“FLUSH TABLES WITH READ LOCK”生效后,在Master Server上执行“SHOW MASTER STATUS;”,“File”栏下记录的是日志的名字,“Position”栏记录的是偏移量,记下日志名字和偏移量,以后要用到。然后执行“UNLOCK TABLES;”,启用写语句。
如果你使用了InnoDB表,最好的方法是使用InnoDB Hot Backup工具,可以去http://www.innodb.com/manual.php查看具体信息。
如果没有使用InnoDB Hot Backup工具,最快的制作InnoDB表快照的方法就是关掉Master Server,拷贝InnoDB数据文件、日志文件、表定义文件。在关闭Master Server之前,你需要记录日志文件名字和偏移量,使用下面的语句:
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
记录完以后,直接关闭Server,不要运行“UNLOCK TABLES;”,以保证快照对应的日志名字和偏移量没有改变。
mysqladmin -u root shutdown //关闭Server
注:有一个可以同时应用于MyISAM和InnoDB表的方法——做Master的SQL dump。
在Master Server上执行“mysqldump --master-data”,然后在Slave Server上导入在Master Server上导出的数据文件,但是这种方法慢。
如果Master Server以前是以 “without --log-bin enabled”运行的,那么通过“SHOW MASTER STATUS”查看的日志文件和偏移量将是空的,mysqldump也会是空的。这样,当一会要制定Slave的log file and position时,就使用空字符串“’’”和4。

5. 确保Master Server上的my.cnf文件中[mysqld]块包括一个log-bin选项和server-id=master_id选项,并且master_id是一个位于1 to 232 – 1之间的正数。
[mysqld]
log-bin
server-id=1
如果没有,添加并重启Server
6. 关闭Slave Server上的MySQL,在my.cnf活my.ini中添加
[mysqld]
server-id=slave_id
slave_id也是一个位于1 to 232 – 1之间的正数,但是不能和master_id一样。如果不止一台Slave Server,则每一台Slave Server的slave_id不能相同。
启动Slave Server上的MySQL之前,确保从Master Server上备份的数据已经放到Slave Server上MySQL的数据库目录中。并确认权限设置正确。如果使用mysqldump备份的,先启动Slave Server。
7. 启动Slave Server上的MySQL。如果以前设置过复制,则使用--skip-slave-start选项,确保启动后不立即连接Master Server。也可以使用--log-warnings选项,当出现问题时可以获得更多的信息。
如果使用mysqldump备份数据的,导入数据:“mysql -u root -p < dump_file.sql”
8. 在Slave Server上执行下面的语句:

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;
替换选项中的值为实际值。
下面是选项长度限制:

MASTER_HOST 60
MASTER_USER 16
MASTER_PASSWORD 32
MASTER_LOG_FILE 255


9. 启动Slave线程:
mysql> START SLAVE;
至此,应该可以实现数据库的复制了。
其他问题:
如果忘记设置Master Server的server-id的值,Slave Server就不能连接到Master Server
如果忘记设置Slave Server的server-id的值,你将得到下面的错误提示:
Warning: You should set server_id to a non-0 value if master_host is set; We force the server id to 2, but this MySQL server will not act as a slave.
如果出现其他原因导致不能同步,你可以在Slave的错误日志里看到错误提示。
当Slave Server开始复制数据库时,你可以在data directory中发现master.info和relay-log.info,Slave通过这两个文件来跟踪Master的binary log。不要删除和编辑这两个文件,尽量使用“CHANGE MASTER TO”语句。
master.info会覆盖一些在命令行制定的选型和在my.cnf中的选项。
当配置好一台Slave Server后,可以使用同样的方法配置其他的Slave Server,不需要重新备份Master Server的数据库,使用同一个即可。

有关操作系统的更多文章请进:技术无忧


相关文章

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面

300x250广告位招租