大家应该记得之前本站机器因为做的是冷备,而且由于一些不可抗因素导致备份也跟着丢失的事情。非常惨痛的教训。。虽然有不少的备份方案,但是给自己用的却没有,都是给客户搭建的冷备方案。所以我将分两三个文章讲讲热备。
原文发表在我的网站 -- 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,输入下面命令登陆数据库。
- mysql -uroot -p
输入上面指令后回车,然后输入密码回车登陆[注意输入密码是看不到的]。然后出现 mysql>的提示符。输入SQL语句。如下:
- mysql> grant replication slave on *.* to 'backup'@'123.456.789.1' identified by '123456';
- # 输入上面命令后回车,不包括 mysql>
- mysql> exit;
- # 输入exit; 退出SQL语句执行窗口。
上面这里就建立了一个可以在123.456.789.1这个IP上才能登陆的同步账户backup,密码是123456,权限是replication slave。测试连接
在备份机(从机)上尝试登陆,看看是否成功。
- 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 命令。
【注意下面这个在主机器上面执行,不是备份机,切换主机器窗口哈。】
- vim /etc/my.cnf
打开后,按下 / 按键,输入关键词“mysql-bin”或者“server-id”回车即可定位到要配置的地方。
- # Replication Master Server (default)
- # binary logging is required for replication
- log-bin=mysql-bin
- # binary logging format - mixed recommended
- binlog_format=mixed
- # required unique id between 1 and 2^32 - 1
- # defaults to 1 if master-host is not set
- # but will not function as a master if omitted
- server-id = 1
正常来说第3,6,11三行配置都是有的,这里主机器的server-id 不修改,备份机器则要改为2,如果多台,就以此类推的3456,每一台不一样即可。
- # 只读配置,不影响super用户和replication
- read-only = 0
- # binlog-do-db是设置备份白名单
- binlog-do-db = text
- # 多少机器设置多少,如果主从总共两台设置2,不小于2.
- auto-increment-increment = 2
- # 这一台是第几台,同server-id 的数字一样即可。
- auto-increment-offset = 1
上面这里binlog-do-db是写需要热备的数据库名,如果有多个写多几个,一行一个哈。如果想用忽略名单类型的,用下面这个:
- read-only = 0
- binlog-ignore-db = mysql
- binlog-ignore-db = information_schema
- binlog-ignore-db = performance_schema
- auto-increment-increment = 2
- 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服务。
- # linux输入
- service mysql restart
- # linux下的lnmp可以用上面也可以用
- lnmp restart
- # windows根据相应环境操作,或者面板操作。
查看master机器状态
- #在主机器上,登陆mysql
- mysql -uroot -p
- # 回车输入密码,然后输入如下指令
- mysql> show master status\G
- # 即可查看状态。记录状态 File 和 Position 的值
- # 退出
- mysql> exit;
查看master的状态,截图中的file提示了现在记录所在文件,position指定了具体位置。
这两个信息截图下来,等会备用。从机器[slave]配置
下面这个是从备份机操作的哈,千万别弄错了哈。
- #编辑配置文件
- vim /etc/my.cnf
- # 按下/ 输入 server-id 定位
- # 修改server-id 的1 改为2
- server-id = 2
首先这里修改server-id ,这是必须改的。然后插入如下内容:
- # 要同步的数据库
- replicate-do-db = text
- # 定义relay日志名
- relay_log = mysqld-relay-bin
- # salve从机执行日志。
- log-slave-updates = ON
- # 由于后面讲双主,这里写ON
第六行log-slave-updates 这个如果只是单纯主从就不需要打开了,如果是双主,或者多机循环备份才打开。
和上面主机器配置文件一样,可以指定,也可以选择排除。有的人数据库多的话,可以选择下面这种排除法。记得啊,如果主机器是选择法,则从机器的这里配置也用选择法,如果主机器是忽略法,从机器这里也选择忽略法,避免出问题。
- # 忽略下面几个数据库
- replicate-ignore-db = mysql
- replicate-ignore-db = information_schema
- replicate-ignore-db = performance_schema
- # 下面两个不再解释
- relay_log = mysqld-relay-bin
- log-slave-updates = ON
这里有人纳闷了为啥截图前面的主的是一个数据库,下面是三个呢,请忽略这个细节哈。因为我后来是同步三个数据库。
编辑方法:光标移动要修改的位置-->按下“insert”-->编辑后按下“ESC”-->shift+Q-->wq-->回车然后重启mysql服务。
- # linux输入
- service mysql restart
- # linux下的lnmp可以用上面也可以用
- lnmp restart
- # windows根据相应环境操作,或者面板操作。
开始连接和测试
这一步很重要,有的文章根本不提这个。这一步依然在从机(备份机)上操作。
- # 在备份机上登陆本机账户
- mysql -uroot -p
- # 然后回车,然后再写密码。回车进入SQL命令行
- # 停用数据库
- mysql> stop slave;
- # 建立连接
- 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;
- # 启动数据库
- mysql> start slave;
- # 查看链接状态
- 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命令行窗口。
如何实验呢,在主机的数据库里找个不影响的表,插入一条数据,或者修改一个数据,然后再看看备份机上数据库的同一个位置的数据是否跟着一起变化。
双主热备
其实就是把前面建立数据库连接这里的步骤重新做一遍,只是有的原来有的不需要增加而已。为了更直观,下面给出两套配置文件的样本。
下面是主机器的[涉及热备]部分配置文件信息
- # Replication Master Server (default)
- # binary logging is required for replication
- log-bin=mysql-bin
- # binary logging format - mixed recommended
- binlog_format=mixed
- # required unique id between 1 and 2^32 - 1
- # defaults to 1 if master-host is not set
- # but will not function as a master if omitted
- server-id = 1
- # 上面是自带的内容,下面是增加的内容。
- read-only = 0
- binlog-do-db = text #text是假设的数据库名
- # 如果用排除的形式,do 改为 ignore ,一行一条,如果不懂返回前面看哈。
- auto-increment-increment = 2
- auto-increment-offset = 1
- replicate-do-db = text
- # 如果用排除的形式,do 改为 ignore ,一行一条,如果不懂返回前面看哈。
- relay_log = mysqld-relay-bin
- log-slave-updates = ON
下面是备份机[涉及热备]部分配置文件信息
- # Replication Master Server (default)
- # binary logging is required for replication
- log-bin=mysql-bin
- # binary logging format - mixed recommended
- binlog_format=mixed
- # required unique id between 1 and 2^32 - 1
- # defaults to 1 if master-host is not set
- # but will not function as a master if omitted
- server-id = 2
- # 上面除了这个server-id = 1 改为2,其他不变,下面是增加的内容。
- replicate-do-db = text
- relay_log = mysqld-relay-bin
- log-slave-updates = ON
- read-only = 0
- binlog-do-db = text
- auto-increment-increment = 2
- auto-increment-offset = 2
只要细心从前面看一遍,下面最后这里给出的配置文件大家都不难看出的。然后步骤都一样。注意 server-id和 auto-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,打开搜索日期或者时间,注意环境不同日期写的格式有点不同,先看看他们的日期格式,然后搜索,然后找到时间和你操作时间一样的看看。找不到的话可能是你系统时间不准导致。
- 170101 17:10:04 [Note] Server hostname (bind-address): '0.0.0.0'; port: 3306
- 170101 17:10:04 [Note] - '0.0.0.0' resolves to '0.0.0.0';
- 170101 17:10:04 [Note] Server socket created on IP: '0.0.0.0'.
- 170101 17:10:04 [ERROR] Failed to open the relay log './xx-relay-bin.000002' (relay_log_pos 1515)
- 170101 17:10:04 [ERROR] Could not find target log during relay log initialization
- 170101 17:10:04 [ERROR] Failed to initialize the master info structure
- 170101 17:10:04 [Note] Event Scheduler: Loaded 0 events
- 170101 17:10:04 [Note] /usr/local/mysql/bin/mysqld: ready for connections.
- Version: '5.5.2-log' socket: '/tmp/mysql.sock' port: 3306 Source distribution
- 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的也一起删除,切记别把不相关的其他文件删除。比如上面这里可以用指令:
- rm -rf xx-relay-*
日志文件控制
如果想控制日志文件天数,不要让他一直增加,在数据库配置文件里查找expire_logs_days这个参数,设置时间改为想要的,比如5就是五天。如下:
- 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