码迷,mamicode.com
首页 > 数据库 > 详细

Mysql 主从设置

时间:2015-06-25 13:44:52      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:

一、准备服务器

由于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上的数据。

Mysql 主从设置

标签:

原文地址:http://www.cnblogs.com/donizzh/p/4599650.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!