一、准备服务器
由于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 statusG
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上的数据。