我有两个 Sql 数据库,“MASTER”和“SLAVE”,我使用 Sql 复制来同步它们。我在两个数据库上都使用 MariaDB 10。MASTER
数据库使用 Docker 安装在 Linux PLC 上。SLAVE
位于 NAS 服务器上,也使用 Docker。
在我切断 PLC 的电源之前,它工作得很好...当我重新启动它时,SLAVE 无法读取 binlog,并且复制过程停止了。
这似乎是一个非常常见的问题,但我还没有找到解决方案,让复制在断电后自动再次运行......
有办法解决这个问题吗?
我发现 PerconaDB 可以解决这个问题,但我的 armv7 PLC 不兼容。
谢谢
答案1
如果丢失一些数据并不困扰我怎么办?丢失大约 1 小时的数据采集不是问题,但我确实需要复制来自动且可靠地恢复
我不喜欢这种方式。最好找出原因,并在重启后停止 mariadb 以清除/重置主服务器。那将是最好的解决方案。
自动:好吧,创建一个简单的脚本并在 crontab @reboot 中执行它。
RESULT=$(mysql -NLr -e 'show master status')
FILE=$(echo ${RESULT} | cut -d ' ' -f 1)
LOGPOS=$(echo ${RESULT} | cut -d ' ' -f 2)
and maybe execute remote: mysql -h slavedb -e "CHANGE MASTER TO MASTER_LOG_FILE=$FILE, MASTER_LOG_POS=$LOGPOS;"
也许在这里您可以找到一种更安全的方法来自动恢复数据库。但不要忘记先删除/清理从属服务器。不确定您的数据。可能需要一段时间。
只需将其放入 cronjob 中即可: 初始化位于主服务器之外的另一个网络上的 MySQL 从服务器
mysqldump --all-databases --master-data=1 | mysql -h slavedb
您所需要的只是连接到从属数据库以及具有从主数据库到从属数据库的管理员权限的超级用户/root。用户也必须存在于主数据库中。转储/恢复后将被覆盖。
答案2
有几种解决方案可以解决这个问题,但不是自动的!但首先,错误消息有助于了解原因。通常,从服务器会尝试重新连接到主服务器并自行继续复制。那么问题是,当前的问题是什么?
手动解决方案:
解决方案 #1 跳过错误 可能会发生数据丢失!
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1; 启动从属服务器;显示从属服务器状态 \G; 重复此操作,直到从属服务器启动并运行。但请注意,数据可能会丢失。
解决方案 #2 SQL 转储/备份恢复。
在 Master 上:首先执行数据库锁。
show master status \g;
Result may look like:
show master status \g;
+------------------+-----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+-----------+--------------+------------------+-------------------+
| mysql-bin.000063 | 176085122 | | | |
+------------------+-----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
在主服务器和所有数据库上执行 SQL 转储。在从属服务器上恢复 SQL 转储。可能删除 master.info 或使用主服务器的新文件和日志位置对其进行编辑。
释放主服务器上的数据库锁。启动从服务器,复制应再次运行。
解决方案#3 主数据库和从数据库必须是相同的版本,相同的硬件架构和操作系统。
除了 mysql dump,您还可以停止主服务器和从服务器的数据库。只需将数据库文件从主服务器复制或同步到从服务器即可。
auto.conf 包含唯一的服务器 ID。在启动从属服务器之前,请删除此文件或在从属系统上编辑 ID。
有关“change_master_to”的更多信息https://mariadb.com/kb/en/library/change-master-to/
希望您了解设置主/从复制的基础知识。
但是,这些步骤可以通过脚本完成,并由 crontab (@reboot) 启动。但我永远不会自动执行此操作,因为我不关心数据及其一致性。