经验分享-mysql主从/双主热备的配置与常规错误排查

来源:互联网 发布:php获取js变量值 编辑:程序博客网 时间:2024/06/12 01:24

大家应该记得之前本站机器因为做的是冷备,而且由于一些不可抗因素导致备份也跟着丢失的事情。非常惨痛的教训。。虽然有不少的备份方案,但是给自己用的却没有,都是给客户搭建的冷备方案。所以我将分两三个文章讲讲热备。

原文发表在我的网站 -- SDT技术网:http://www.sdtclass.com/4585.html

工作原理


mysql的自带就有主从热备的功能,工作原理就是主库把执行操作记录日志,然后备份机把执行日志写入relay日志,然后在备份机上执行一次。期间通过一个指定的数据库账户密码远程登陆来进行通信。

准备工作


最好是临时关闭网站,然后把两个数据库名设置一样。数据库的数据一样。这是必须的哈。也就是所谓的初始状态一样。

远程连接


从上面的工作原理介绍(我是说的太简单了,有兴趣可以找别的文章深入了解)可以看出首先我们需要连接。讲远程连接,我首先想到你们的iptables或者别的防火墙的事情,这个由于不同系统不同防火墙,不同规则,所以我改天讲解并且放入口在这里,也可以自己百度搜索方法。

建立备份账户[面板]


建立账户有两个方法,一个通过phpmyadmin等数据库管理工具,一个利用命令行。这里我讲两个。
phpmyadmin方法:
登陆主服务器的phpmyadmin

 
点击添加用户,进入下面页面,填写账户、IP、密码。

这里第二行的IP地址是写备份服务器(也就是从机)的,比如你现在的主机器IP是123.456.1.1 ,备机IP是123.456.789.1,那么这里你就写123.456.789.1。

这里设置权限的时候,只要第三列 REPLICATION SLAVE 这个权限。也就是倒数第二个。然后提交即可。

建立备份账户[命令行]


首先,用putty等工具连主机器的SSH,输入下面命令登陆数据库。


    1. mysql -uroot -p



输入上面指令后回车,然后输入密码回车登陆[注意输入密码是看不到的]。然后出现 mysql>的提示符。输入SQL语句。如下:




    1. mysql> grant replication slave on *.* to 'backup'@'123.456.789.1' identified by '123456';


    1. # 输入上面命令后回车,不包括 mysql>

    1. mysql> exit;


    1. # 输入exit; 退出SQL语句执行窗口。



上面这里就建立了一个可以在123.456.789.1这个IP上才能登陆的同步账户backup,密码是123456,权限是replication slave。

测试连接


在备份机(从机)上尝试登陆,看看是否成功。


    1. mysql -h123.456.1.1 -ubackup -p



输入指令后回车,输入密码,一样密码是看不见的,然后回车。
注意,因为是在备份机器上面,登陆主机器,所以这里的IP是主机器的IP而不是备份机的IP,和上面建立账户是不一样的。一个是建立时候指定可以登陆的IP白名单,一个是从白名单的机器登陆主机器。
如果登陆后,没有出现 mysql> 这样的提示符的,则是失败。需要回到前面远程连接这一环节检测防火墙的设置,端口开启等情况。正确的如下:
然后和上面一样,输入 exit;  退出界面。

主机器[master]配置


首先,不同系统或者环境差异下,mysql数据库的配置文件所在路径不同。
linux一般是:/etc/my.cnf
windows系wamp:E:\wamp\bin\mysql\mysql5.6.17\my.ini
win的直接notepad++打开,linux用 vi 或者 vim 命令。
【注意下面这个在主机器上面执行,不是备份机,切换主机器窗口哈。】



    1. vim /etc/my.cnf



打开后,按下 / 按键,输入关键词“mysql-bin”或者“server-id”回车即可定位到要配置的地方。




    1. # Replication Master Server (default)


    1. # binary logging is required for replication

    1. log-bin=mysql-bin



    1. # binary logging format - mixed recommended


    1. binlog_format=mixed



    1. # required unique id between 1 and 2^32 - 1

    1. # defaults to 1 if master-host is not set


    1. # but will not function as a master if omitted

    1. server-id       = 1



正常来说第3,6,11三行配置都是有的,这里主机器的server-id 不修改,备份机器则要改为2,如果多台,就以此类推的3456,每一台不一样即可。




    1. # 只读配置,不影响super用户和replication


    1. read-only = 0

    1. # binlog-do-db是设置备份白名单


    1. binlog-do-db = text

    1. # 多少机器设置多少,如果主从总共两台设置2,不小于2.


    1. auto-increment-increment = 2

    1. # 这一台是第几台,同server-id 的数字一样即可。


    1. auto-increment-offset = 1



上面这里binlog-do-db是写需要热备的数据库名,如果有多个写多几个,一行一个哈。如果想用忽略名单类型的,用下面这个:



    1. read-only = 0


    1. binlog-ignore-db = mysql

    1. binlog-ignore-db = information_schema


    1. binlog-ignore-db = performance_schema

    1. auto-increment-increment = 2


    1. auto-increment-offset = 1



auto-increment-increment 是ID累加的时候,增量多少,一般是累加1,但是这样容易引起ID重复冲突,所以这里设置2,如果主从总共有5台,这里设置5,以此类推。
auto-increment-offset 是表示序号的,这里和server-id 设置一样,设置1。这里提醒下,如果要做双主热备的话,备份机器的这一个参数和server-id 都写2。如果是5台,另外3台分别是3,4,5这样子。

编辑方法:光标移动要修改的位置-->按下“insert”-->编辑后按下“ESC”-->shift+Q-->wq-->回车
然后重启mysql服务。


    1. # linux输入


    1. service mysql restart

    1. # linux下的lnmp可以用上面也可以用


    1. lnmp restart

    1. # windows根据相应环境操作,或者面板操作。



查看master机器状态






    1. #在主机器上,登陆mysql


    1. mysql -uroot -p

    1. # 回车输入密码,然后输入如下指令


    1. mysql> show master status\G

    1. # 即可查看状态。记录状态 File 和 Position 的值



    1. # 退出


    1. mysql> exit;



查看master的状态,截图中的file提示了现在记录所在文件,position指定了具体位置。

这两个信息截图下来,等会备用。

从机器[slave]配置


下面这个是从备份机操作的哈,千万别弄错了哈。



    1. #编辑配置文件


    1. vim /etc/my.cnf

    1. # 按下/ 输入 server-id 定位


    1. # 修改server-id 的1 改为2

    1. server-id       = 2



首先这里修改server-id ,这是必须改的。然后插入如下内容:




    1. # 要同步的数据库


    1. replicate-do-db = text

    1. # 定义relay日志名


    1. relay_log = mysqld-relay-bin

    1. # salve从机执行日志。


    1. log-slave-updates = ON

    1. # 由于后面讲双主,这里写ON



第六行log-slave-updates 这个如果只是单纯主从就不需要打开了,如果是双主,或者多机循环备份才打开。
和上面主机器配置文件一样,可以指定,也可以选择排除。有的人数据库多的话,可以选择下面这种排除法。记得啊,如果主机器是选择法,则从机器的这里配置也用选择法,如果主机器是忽略法,从机器这里也选择忽略法,避免出问题。




    1. # 忽略下面几个数据库


    1. replicate-ignore-db = mysql

    1. replicate-ignore-db = information_schema


    1. replicate-ignore-db = performance_schema

    1. # 下面两个不再解释


    1. relay_log = mysqld-relay-bin

    1. log-slave-updates = ON



这里有人纳闷了为啥截图前面的主的是一个数据库,下面是三个呢,请忽略这个细节哈。因为我后来是同步三个数据库。

编辑方法:光标移动要修改的位置-->按下“insert”-->编辑后按下“ESC”-->shift+Q-->wq-->回车然后重启mysql服务。



    1. # linux输入


    1. service mysql restart

    1. # linux下的lnmp可以用上面也可以用


    1. lnmp restart

    1. # windows根据相应环境操作,或者面板操作。



开始连接和测试


这一步很重要,有的文章根本不提这个。这一步依然在从机(备份机)上操作。




    1. # 在备份机上登陆本机账户


    1. mysql -uroot -p

    1. # 然后回车,然后再写密码。回车进入SQL命令行


    1. # 停用数据库

    1. mysql> stop slave;


    1. # 建立连接

    1. mysql> change master to master_host='123.456.1.1'master_user='backup',master_password='123456'master_log_file='mysql-bin.000006'master_log_pos=221059257;


    1. # 启动数据库

    1. mysql> start slave;


    1. # 查看链接状态

    1. mysql> show slave status\G;



第7行这里要注意几个地方,一个是IP地址是写主机器的IP[和前面添加账户不一样,前面是写备份机的IP,这里是写主机器的IP,因为你这时候要从备份机器连接主机器],账户密码是前面在主机器上分配给备份机的那个操作的账户密码。master的文件是上面查看master状态记录的file,最后这个的参数就是position的。
还有,最后这个不要引号哈,最后这个等于号后面没引号,别自作聪明哦。
第7行这个执行如果报错,那请看错误日志,看错误提示等,也可以看本文后面的介绍。正常如下:

这里有的文章误导,说Slave_IO_Running 这个是yes,其实当时我也纳闷,怎么这里是这样,有问题?可是又不像有问题啊,然后去测试了下数据库操作,发现是正常的。这里因为是备份机,所以这样,如果做双主,这里确实就是yes的。Slave_SQL_Running 这里就是YES。如果这两个或者其中一个是NO,那就有问题了,要检查日志,后面提到。这里可以输入exit; 退出mysql命令行窗口。
如何实验呢,在主机的数据库里找个不影响的表,插入一条数据,或者修改一个数据,然后再看看备份机上数据库的同一个位置的数据是否跟着一起变化。

双主热备


其实就是把前面建立数据库连接这里的步骤重新做一遍,只是有的原来有的不需要增加而已。为了更直观,下面给出两套配置文件的样本。
下面是主机器的[涉及热备]部分配置文件信息




    1. # Replication Master Server (default)


    1. # binary logging is required for replication

    1. log-bin=mysql-bin



    1. # binary logging format - mixed recommended


    1. binlog_format=mixed



    1. # required unique id between 1 and 2^32 - 1

    1. # defaults to 1 if master-host is not set


    1. # but will not function as a master if omitted

    1. server-id       = 1



    1. # 上面是自带的内容,下面是增加的内容。



    1. read-only = 0


    1. binlog-do-db = text #text是假设的数据库名

    1. # 如果用排除的形式,do 改为 ignore ,一行一条,如果不懂返回前面看哈。


    1. auto-increment-increment = 2

    1. auto-increment-offset = 1



    1. replicate-do-db = text


    1. # 如果用排除的形式,do 改为 ignore ,一行一条,如果不懂返回前面看哈。

    1. relay_log = mysqld-relay-bin


    1. log-slave-updates = ON



下面是备份机[涉及热备]部分配置文件信息



    1. # Replication Master Server (default)


    1. # binary logging is required for replication

    1. log-bin=mysql-bin  



    1. # binary logging format - mixed recommended


    1. binlog_format=mixed



    1. # required unique id between 1 and 2^32 - 1

    1. # defaults to 1 if master-host is not set


    1. # but will not function as a master if omitted

    1. server-id       = 2



    1. # 上面除了这个server-id = 1 改为2,其他不变,下面是增加的内容。



    1. replicate-do-db = text


    1. relay_log = mysqld-relay-bin  

    1. log-slave-updates = ON



    1. read-only = 0


    1. binlog-do-db = text

    1. auto-increment-increment = 2


    1. auto-increment-offset = 2



只要细心从前面看一遍,下面最后这里给出的配置文件大家都不难看出的。然后步骤都一样。注意server-idauto-increment-offset 两个文件的值必须不一样哈!!!

首先:把A机器当主机器,B机器当备份机,从上面做一遍步骤。
然后:把B机器当主机器,把A机器当备份机,继续做一遍。配置文件和上面这样一样。增加的内容顺序没有要求。自己看懂即可。

常见问题


如果在测试连接的时候,就提示错误无法登陆。那么首先请确保在主机器上设置的账户、密码、权限是否有误。如果没记录错,那么防火墙是否通顺。在主机器上设置的账户可以登陆的IP是写备用机的,切记!!还有在主机器上设置的账户在主机器上是无法登陆的,因为设置的IP地址指定了从哪个IP地址登陆。切记切记哦!还有检查防火墙是否通顺,实在不行关闭防火墙试试。
还有每次修改mysql配置文件都记得重启一次mysql服务哦!不然配置不生效肯定错误。
如果测试连接没错误,在后面正式连接的时候操作提示错误。一般看日志,由于系统和环境的差异日志所处文件也可能不同。
linux:/usr/local/mysql/var/xxx.err
windows下wamp:E:\wamp\bin\mysql\mysql5.6.17\data\xxx.err
名字一般是机器的名字,所以我这里用xxx来代表,同时也有一个 xxx.pid 文件哈。
打开文件,linux用vim或者vi,打开搜索日期或者时间,注意环境不同日期写的格式有点不同,先看看他们的日期格式,然后搜索,然后找到时间和你操作时间一样的看看。找不到的话可能是你系统时间不准导致。


    1. 170101 17:10:04 [Note] Server hostname (bind-address): '0.0.0.0'; port: 3306


    1. 170101 17:10:04 [Note]   - '0.0.0.0' resolves to '0.0.0.0';

    1. 170101 17:10:04 [Note] Server socket created on IP: '0.0.0.0'.


    1. 170101 17:10:04 [ERROR] Failed to open the relay log './xx-relay-bin.000002' (relay_log_pos 1515)

    1. 170101 17:10:04 [ERROR] Could not find target log during relay log initialization


    1. 170101 17:10:04 [ERROR] Failed to initialize the master info structure

    1. 170101 17:10:04 [Note] Event Scheduler: Loaded 0 events


    1. 170101 17:10:04 [Note] /usr/local/mysql/bin/mysqld: ready for connections.

    1. Version: '5.5.2-log'  socket: '/tmp/mysql.sock'  port: 3306  Source distribution


    1. 170101 17:10:32 [Warning] IP address '123.456.789.1' could not be resolved: Temporary failure in name resolu



比如上面这种,提示什么文件找不到之类的,可以把对应的文件,比如 xx-relay-bin.000002 找不到,但是ls查看又可以看到这个文件,那么你可以把xx-relay-index,xx-relay-bin.000001/2,这样的文件都删掉,然后重启mysql服务,让他重新生成。重启指令前面说两次了,这里不说了。
删除文件的时候,指定文件的和指定文件前面名字一样的,只是数字不一样而已的,包括名字-index的也一起删除,切记别把不相关的其他文件删除。比如上面这里可以用指令:


    1. rm -rf xx-relay-*



日志文件控制


如果想控制日志文件天数,不要让他一直增加,在数据库配置文件里查找expire_logs_days这个参数,设置时间改为想要的,比如5就是五天。如下:




    1. expire_logs_days = 5



好了,说到这里也累了,基本都概括在这里了哈。
参考:
感谢下面三个作者文章贡献,参考后重新整理。
http://www.cnblogs.com/zhongweiv/archive/2013/02/01/mysql_replication_circular.html
http://yunnick.iteye.com/blog/1845301
http://blog.csdn.net/binyao02123202/article/details/19323399
 

原创粉丝点击