提问人:Arno Schäfer 提问时间:10/11/2023 最后编辑:Arno Schäfer 更新时间:10/11/2023 访问量:56
mysqldump 还原后 Mariadb 表为空
Mariadb tables empty after mysqldump restore
问:
我遇到了一个让我难倒的问题。我有两个数据库服务器,一个通过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中的一个错误,它在版本10.11.6(以及其他版本)中得到了修复。
评论