Linux下的Mysql的主从备份
MySQL复制概述
MySQL数据库支持同步复制、单向、异步复制,在复制的过程中一个服务器充当主服务,而一个或多个服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。
注意:当你进行复制时,所有对复制中的表的更新必须在主服务器上进行。否避免用户对主服务器上的表进行的更新与对从服务器上的表所进行的更新之间的冲突。
MySQL数据复制的原理[3个进程]
MySQL复制基于主服务器在二进制日志【binlog】中跟踪所有对数据库的更改(更新、删除等)。因此,复制必须在主服务器上启用二进制日志,每个从服务器从主服务器接收主服务器已经记录到其二进制日志【relaylog】的保存的更新,以便从服务器可以对其数据拷贝执行相同的更新。
Linux下的Mysql服务器主备的实现
[主服务器:192.168.25.136] [从服务器:192.168.25.144]
在主服务器136上查看主状态以最新的服务器状态为准,在从服务器配置
1 | mysql -uroot -proot<br>show master status\G |
第一行表明 当前正在记录的 binarylog文件名是: mysql-bin.000001.
第二行,810 表示当前的文件偏移量, 就是写入在mysql-bin.000001 文件的记录位置。
第三行和第四行,表示需要记录的数据库和需要忽略的数据库。 只有需要记录的数据库,其变化才会被写入到mysql-bin.000001日志文件中。
注意:如果显示"Empty Set",则需要检查是否开启了bin文件(小规模文件my-small.cnf默认不开启,本博客的mysql配置以small为准,因此需修改)
1 | sed -i 's/#log-bin=mysql-bin/log-bin=mysql-bin/g' /etc/my.cnf |
在主服务器136上面创建专门用于备份的用户double
1 | GRANT REPLICATION SLAVE ON *.* TO 'double' @ '192.168.25.144' IDENTIFIED BY 'double' ; |
开启主服务器136的 binarylog
vim /etc/my.cnf
1 2 3 4 5 6 7 | # 添加如下内容 binlog_format=mixed binlog-ignore-db=mysql auto-increment-offset=1 auto-increment-increment=3 注:binlog-ignore-db 表示,需要忽略哪些数据库。我这里忽略了其他的4个数据库。 假设需要将来可能需要3台服务器做备份, 所以auto-increment-increment 设为3. 而 auto-increment-offset=1 表示这台服务器的序号从1开始, 不超过auto-increment-increment。这样做之后, 我在这台服务器上插入的第一个 id 就是 1, 第二行的 id 就是 4了, 而不是2. |
重启136服务器的mysql服务
1 2 | service mysqld restart ==> /etc/inint .d /mysqld restart |
获取主服务器136状态
如果是全新安装的, 那么不需要同步初态,直接跳过这一步,到后面直接查看主服务器状态。
如果已经有了一个数据库ftl数据库作为初态。
1 2 3 4 | 先锁定 hello数据库: flush tables with read lock; 然后导出数据: mysqldump -uroot -proot ftl -B -x> /tmp/ftl .sql 查看A服务器的binary日志位置 show master status\G 记住这个文件名和 位置, 等会在从服务器上会用到 解除锁定了 unlock tables; |
设置从服务器 144需要复制的数据库
修改从服务器的server_id
1 | sed -i 's/server-id.*1/server-id = 2/g' /etc/my.cnf |
修改: vim /etc/my.cnf
1 2 3 4 | # 添加如下内容 relay-log = relay-log replicate-ignore-db=information_schema replicate-ignore-db=performance_schema |
注:replicate-ignore-db 复制时需要排除的数据库。除开系统的几个数据库之外,所有的数据库都复制。
relay_log 中继日志的名字。 前面说到了, 复制线程需要先把远程的变化拷贝到这个中继日志中, 再执行。
log-slave-updates 意思是,中继日志执行之后,这些变化是否需要计入自己的binarylog。 当你的B服务器需要作为另外一个服务器的主服务器的时候需要打开。 就是双主互相备份,或者多主循环备份。 我们这里需要, 所以打开。
重启144服务器的mysql服务
1 2 | service mysqld restart ==> /etc/inint .d /mysqld restart |
查看从服务器的server_id
1 2 | mysql -uroot -proot SHOW VARIABLES LIKE 'server_id' ; # 显示跟配置一致即可,前面我们设置 2 |
从服务器测试主服务器的注册的double用户是否正常
1 | mysql -h 192.168 . 2.144 -udouble -pdouble |
在从服务器144上导入主服务器136的初态
1 2 | scp root@192.168.25.144: /tmp/ftl .sql /tmp/ftl .sql mysql -uroot -proot < /tmp/ftl .sql [没有添加库名,是因为备份的时候使用了-B,里面还有自动建库的语句] |
开启同步, 在从服务器144服务器上执行
1 2 3 4 5 6 | CHANGE MASTER TO MASTER_HOST= '192.168.25.136' , # 主服务器IP MASTER_USER= 'double' , MASTER_PASSWORD= 'double' , # 主服务器设置的用户 MASTER_LOG_FILE= 'mysql-bin.000001' , # 根据主服务器看 : show master status\G 里面的 File MASTER_LOG_POS=2702; # 根据主服务器查看; show master status\G 里面的 Position |
从服务器重启mysql服务, 然后查看slave线程是否正常
上面几个参数要跟上面的保持一致,而且IP尽量用补全,除非在局域网环境,多台备份服务器
如果其中一个是No, 那就说明不成功。需要查看mysql的错误日志[/usr/local/mysql/data/*.err]
密码,防火墙,ip地址不对等都会导致失败,查看日志文件即可
主从复制结果
在主服务器的ftl数据库的user表中 连续插入了3条数据, 查看从服务器是否同步数据了
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
· 用纯.NET开发并制作一个智能桌面机器人:从.NET IoT入门开始
· 一个超经典 WinForm,WPF 卡死问题的终极反思
· ASP.NET Core - 日志记录系统(二)
· .NET 依赖注入中的 Captive Dependency
· 几个自学项目的通病,别因为它们浪费了时间!
· 在外漂泊的这几年总结和感悟,展望未来
· 如何在 ASP.NET Core 中实现速率限制?
· 博客园 & 1Panel 联合终身会员上线
· Kubernetes 知识梳理及集群搭建