异地主从双机热备份实战
主从双机热备份
场景
我的个人博客部署在windows服务器上,现未防止数据丢失,准备做一个灾备,即使用另一台服务器来同步windows服务器上的数据。
关于双机热备份
由于水平有限,只能按照自己的理解来说明。
简单来说就是两个数据库,一个主数据库A(master),一个从数据库B(slave),B通过读取A的bin-log文件,将A执行内容(insert、delete、update)在自己的数据库中再执行一次。当然这里主-从是相对的,也可以是B是master,A是slave,这样就能够实现对任意一台数据库的操作能够同步到另一台数据库上。
下面是一个常见的异地双机热备份部署图。
然后就开始来将我的博客数据库作备份了。
环境
windows server 2008 : mysql 5.6
centos : mariadb 10.1
部署图
如下,画了一个很简单的部署图。
因为目前只是将应用放在windows服务器上,并没有在centos上部署,所以可以看到centos服务器上只有一个mariadb。如果要在centos上也部署应用,还需要使用nginx作负载均衡才有意义。我暂且只将centos上的数据库作为从数据库,用来实时备份windows上的数据
配置window上的mysql为主数据库
mysql版本为5.6,没有开启binlog,手动在配置文件中开启。
在mysql目录下有一个my.ini,打开编辑,在[mysqld]下添加如下内容:
server-id=1
log-bin=mysql-bin
binlog-do-db=要备份的数据库
然后重启mysql,执行:
show master status;
主数据库配置到这里就好了。
注意:
因为需要远程连接,所以mysql必须配置为允许远程连接。方法如下:
首先检查3306端口是打开。若是云服务器,需要在控制台添加安全组,允许3306端口;
然后设置原创访问的用户和密码:
set password for aaa@qq.com_name=password('pwd');
完了之后可以测一下:
mysql -h host_name -uroot -p
配置centos上的mariadb为从数据库
mariadb其实是和mysql差不多的,语法完全一样。
还是先找到配置文件,在/etc/my.cnf
执行:
vi /etc/my.cnf
编辑内容,在配置中添加:
log-bin=mysql-bin
#这里的id不要和主数据库重复即可
server-id=2
#需要备份的数据库
replicate-do-db=db_blog
#中间日志
relay_log=mysql-relay-bin
#从数据库上的更新日志也记录下来
log-slave-updates=ON
然后重启mariadb:
service mariadb restart
重启之后配置主数据库信息:
change master to
master_host = '数据库服务器ip',
master_user = 'root',
master_password = '******',
master_log_file='mysql-bin.000001',
master_log_pos = 120;
这里的mysql-bin.000001和master_log_pos都可以在主数据库上用show master status
获取到
设置完后,查看slave状态:
show slave status;
注意红色框里的,两项必须都为YES才行。
然后在主数据库(windows)上的mysql插入一条数据,在从数据库(centos)上可以看到新插入的数据。表明备份成功。
将同一个数据库配置为主从
前面说了主-从是相对的,所以这里也可以将windows上的mysql配置为从数据库,而centos上的配置为主数据库,过程类似,只是将以上过程反过来即可。
至此一个简单的异地双击热备份就做完了。但是只是一个简单的备份,并没有考虑到很多问题。
遇到的问题
1.从数据库出现:Slave_IO_Running:NO
原因:master_host写错了,写成从数据库自己的了。
2.show salve status出现两个NO
原因:忘记配置binlog-do-db了
3.在从主数据库上导出数据并导入到从数据库时,出现如下错误:
Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause
原因:
mysql低版本(5.5及一下)对TIMESTAMP列有特殊要求,不能存在指定了两个默认值的TIMESTAMP列。
解决办法:
首先想到用触发器解决,但是这个列是要求在update时自动更新为当前时间的,所以如果添加update触发器就会陷入死循环。因为在update时触发触发器,触发器内部又是对该表的update,将会一直update下去。所以这个方法不使用。
那么只有两个办法了,那个字段值在程序代码中设置进去,但是这样要改动代码,而且不方便。所以决定升级mariadb。
找到一篇参考文章,链接如下:
https://www.vultr.com/docs/how-to-install-mariadb-10-1-on-centos-7
参考这篇文章就行了。
注意将baseurl修改为:
baseurl = https://mirrors.tuna.tsinghua.edu.cn/mariadb/mariadb-10.1.25/yum/rhel7-amd64
不然速度很慢,可能下载不成功。
升级完成后再配置一下,再导入数据就没有问题了。
老吴的博客- 关注Java,致力成为后端全栈工程师。
上一篇: 别让铁轨式思维扼杀了你的未来
下一篇: 你了解MySQL?