您的位置:首页 > 数据库 > MySQL

设置mysql数据库的同步

2012-02-16 11:28 316 查看
一、准备服务器

由于MySQL不同版本之间的(二进制日志)binlog格式可能会不一样,因此最好的搭配组合是Master的MySQL版本和Slave的版本相同或者更低,Master的版本肯定不能高于Slave版本。

我测试设置成功的服务器:

主服务器(以下简称Master)的版本是3.23.58,

从服务器(以下简称Slave)的版本是5.0.91,这个跨度应该算比较大了吧。

Master主机名为:A(IP:192.168.0.1),

Slave 主机名为:B(IP:192.168.0.2),

2个MySQL的basedir目录都是/usr/local/mysql,datadir都是:/var/lib/mysql/ 。

默认安装的就如此。

二、设置同步Master 服务器

1、设置my.cnf

# cp /usr/share/doc/mysql-server-3.23.58/my-large.cnf /etc/my.cnf

对于my-large.cnf这个文件个人觉得只是mysql大型数据库配置的demo文件,copy该目录下的my-small.cnf应该是一样的;

因为我服务器配置比较高,看large里面参数多,省事就选他用了。

修改 my.cnf 文件:

log-bin = mysql-bin #指定生成binlog文件名

server-id = 1 #此id不可重复

binlog-do-db = news #需要备份的数据库名,如果备份多个数据库,重复设置这个选项即可

binlog-ignore-db = mysql #不需要同步的数据库名,可以设定多条

binlog-ignore-db = test #不需要同步的数据库名,可以设定多条

log-slave-updates #这个参数一定要加上,否则不会给更新的记录些到二进制文件里

slave-skip-errors #是跳过错误,继续执行复制操作

2、建立用户

$mysql -u root -p #进入mysql

mysql>CREATE USER TO ‘backup'@'%' DENTIFIED BY ’backuppass’; #创建备份用户backup

mysql>GRANT FILE,SELECT,RELOAD ON *.* TO ‘backup'@'%'; #设置权限

因为mysql版本太老了,所以不支持REPLICATION SLAVE,否则用下面的:

mysql>GRANT FILE,SELECT,RELOAD,REPLICATION SLAVE ON *.* TO ‘backup'@'%'; #设置权限

mysql>FLUSH PRIVILEGES ;

3、在Replication完成前,Master跟Slave的数据内容必須一致,故在备份导出数据库前先Lock成只读。

mysql > FLUSH TABLES WITH READ LOCK;

4、需要同步的news数据库导出,可以使用mysqldump或者是tar的方式压缩起來。

如果用mysqldump的方式:

$mysqldump -u root -p news > news.sql #导出数据库成文件news.sql

因为2个数据版本不一样,且存储编码不一样,我用的上面的方法。

如果用压缩方式:

cd /var/lib/mysql/ #mysql库目录

tar zcvf news.tar.gz news

5、导出数据库后,解除只读:

mysql>UNLOCK TABLES;

6、 重启mysql,前面设置的my.cnf生效;重启后,在Master服务器上的add、update、delete等操作都会记录在binlog文件中

$/etc/init.d/mysql restart 或者 service mysqld restart

7、记录复制启动断点

执行以下命令,记录从服务器开始启动复制的断点,包括日志名和偏移量。

  mysql> SHOW MASTER STATUS;

比如:

  mysql> show master status\G

     File: mysql-bin.001

     Position: 73

     Binlog_Do_DB:

Binlog_Ignore_DB:

日志文件名是:mysql-bin.001

偏移量是:73

注意,等会从服务器将从这个位置开始复制。需要记录下这2个地方。

二、设置同步Slave服务器

1. 导入数据到从服务器器:

我用的是$mysql -u root -p news < news.sql

2、如果是用压缩的办法:

传输拿到主库数据包、解包

# cd /var/lib/mysql/

# scp 192.168.0.1:/var/lib/mysql/news.tar.gz .

# tar zxvf var.tar.gz

查看修改news文件夹权限

# chown -R mysql:mysql news

3, 设置同步Slave的my.cnf

server-id = 2

# log-bin=mysql-bin #我没有用到,只需要从A同步到B即可

master-host = 192.168.0.1

master-user = backup

master-password = backuppass

master-port = 3306

#上面是前面添加的用户名和密码,下面3行是新版本的sql自带的表。

replicate-ignore-db = mysql #忽略掉的数据库

replicate-ignore-db = test #忽略掉的数据库

replicate-ignore-db = information_schema #忽略掉的数据库

replicate-do-db = news #需要备份的数据库名

replicate_do_table = news.user #需要备份的数据表名

master-connect-retry=60 #如果从服务器发现主服务器断掉,重新连接的时间差(秒)

#log-slave-updates #我没有用到,如果从服务器也要更新记录到二进制文件里

slave-skip-errors #是跳过错误,继续执行复制操作

设置完成后,首先检查/var/lib/mysql/目录下是否有mysql的启动关闭日志,类似的为*.info,localhost*,ib*之类的日志 信息。如果有全部删除(提示:先停止mysql服务,再删除),然后启动mysql服务。

4、验证连接MASTER

# mysql -h192.168.0.1 -ubackup -pbackuppass

主机IP、用户名、密码前面不能带有空格

5、设置Master服务器信息,让Slave知道Master的位置

以往的方式是直接在my.cnf中設定master的相關訊息;但是,這樣的方式已經改了,必须使用在 mysql下執行【CHANGE MASTER TO】的指令

在my.cnf中master是錯誤的

master-host = 192.168.0.1

master-user = backup

master-password = backuppass

master-port = 3306

slave stop;

MySQL> CHANGE MASTER TO

-> MASTER_HOST='192.168.0.1',

-> MASTER_USER='backup',

-> MASTER_PASSWORD='backuppass',

-> MASTER_LOG_FILE='mysql-bin.001',

-> MASTER_LOG_POS=73;

slave start;

6,检查同步是否成功

用show slave status;看一下从服务器的同步情况

Slave_IO_Running: Yes

Slave_SQL_Running: Yes

如果都是yes,那代表已经在同步 。

Seconds_Behind_Master是否为0,0就是已经同步了

出现Slave_IO_Running:NO,可能需要开启:

slave stop;

SLAVE start IO_THREAD

slave start;

另外,出现Slave_IO_Running:NO还有一个原因是slave上没有权限读master上的数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: