mysqldump 还原后 Mariadb 表为空

Mariadb tables empty after mysqldump restore

提问人:Arno Schäfer 提问时间:10/11/2023 最后编辑:Arno Schäfer 更新时间:10/11/2023 访问量:56

问:

我遇到了一个让我难倒的问题。我有两个数据库服务器,一个通过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

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

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

以下是主站上的数据库设置,这些设置与从站不同:

[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 被记录在二进制日志中,而不是首先被执行,对吧?

MariaDB 备份 还原

评论

0赞 nbk 10/11/2023
您基本上需要具有相同的版本,才能正常工作,也许如果您知道您的版本,您可以检查是否有可能升级
0赞 Arno Schäfer 10/11/2023
我不确定你说的是哪个版本?正如我所说,我在两台服务器上都运行MariaDB 10.11.4,因此那里应该没有兼容性问题。此外,我的印象是 mysqldumps 几乎与版本无关,但这可能不适用于所有版本。
0赞 nbk 10/11/2023
您在问题中说 MyriaDB 的更新版本在您的第二台服务器上
0赞 nbk 10/11/2023
您应该在两个服务器之间打开一个 SSH 并复制数据
0赞 Arno Schäfer 10/11/2023
@nbk:对不起,这是一个误会。我的意思是我之前可能有一个不同的 mariadb 版本(无论 debian 11 上的版本是什么),当时一切正常。现在,在两台服务器上都安装了 10.11.4,它不再起作用。

答:

0赞 Arno Schäfer 10/11/2023 #1

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