mysqldump 恢复后 Mariadb 表为空

问题描述 投票:0回答:1

我遇到了一个让我困惑的问题。我有两台数据库服务器,一台通过 ssh 隧道复制到另一台(没有问题)。两者都在 Debian 12 上运行 MariaDB 10.11.4。我每晚使用以下命令在从属服务器上进行数据库备份

mysqldump --opt -uroot -p$PASS $DB | gzip > backup.$DATE.dmp.gz

我正在尝试使用命令将主服务器上的备份恢复到临时数据库

gunzip -c backup.$DATE.dmp.gz | mysql -uroot -p$PASS temp

恢复似乎工作正常,没有错误消息,系统日志中也没有错误。然而,在访问数据库“temp”时,所有表都已创建,但都是空的(0 行)。当尝试在其中一个表中手动插入一行时,效果很好,然后它有 1 行。服务器有足够的磁盘空间,所以这应该不是问题。

在从属服务器或不同服务器上尝试相同的恢复时,数据库已正确恢复并包含所有预期数据,因此备份文件看起来没问题。

这些是主站上与从站不同的 DB 设置:

[mysqld]
server_id=4
sql_mode = "ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
collation-server = utf8mb4_unicode_ci
character-set-server = utf8mb4
skip-character-set-client-handshake
init_connect='SET collation_connection = utf8mb4_unicode_ci'
init_connect='SET NAMES utf8mb4'
log_bin                = /var/log/mysql/mysql-bin.log
expire_logs_days       = 4
max_binlog_size        = 100M
binlog_do_db           = tax

(在从站上,除了 server_id 之外,这些都保留为默认值)。

此恢复过去一直没有问题,直到最近将主数据库移动到具有较新 Debian 版本(可能还有较新 MariaDB 版本)的其他服务器。

我尝试在主数据库服务器上恢复两个完全不同的数据库模式的备份,其中一个已正确恢复,另一个具有相同的行为。可能的差异之一是无法恢复的数据库都包含大量 blob 形式的二进制数据。

有什么想法可能导致此问题或如何缩小范围?

编辑:

我现在缩小了范围。配置:

[mysqld]
server_id=3
log_bin                = /var/log/mysql/mysql-bin.log
binlog_do_db = tax

测试文件:

/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;

DROP TABLE IF EXISTS `benutzer`;
CREATE TABLE `benutzer` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `vorname` varchar(255) NOT NULL,
  `nachname` varchar(255) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10433 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO `benutzer` VALUES (1,'Arno','Schäfer');
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;

如果我将服务器设置为此配置并尝试将此测试文件加载到数据库“temp”中,则不会插入任何行。如果我删除配置中的 binlog_do_db 行,问题就会消失。如果我删除 FOREIGN_KEY_CHECKS 或 UNIQUE_CHECKS 行中的任何一个,问题就会消失。我假设我偶然发现了 MariaDB 10.11.4 中的一个错误,除非有人可以解释 binlog_do_db 行如何阻止插入不同的数据库。如果我没记错的话,binlog_do_db应该阻止INSERT被记录在binlog中,但首先不会被执行,对吗?

mariadb backup restore
1个回答
0
投票

事实证明这确实是 MariaDB 中的一个错误,它已在版本 10.11.6(以及其他版本)中修复。

© www.soinside.com 2019 - 2024. All rights reserved.