有一个大的数据库,试图哑需要永远。以前/目前基本上会做:
#!/usr/bin/env bash
mysql -u root << EOF
FLUSH TABLES WITH READ LOCK;
system zfs snapshot db01/mysql@cron-$(date +%Y%m%d.%H%M);
UNLOCK TABLES;
EOF
然后使用zfs send/recv进行增量备份。我们之前已经使用过这些备份进行测试......而且一直都很好。设置一些测试示例,复制一些快照,启动mariadb,它"就可以工作了"。但新示例将始终是具有相同版本mariadb的相同CentOS7映像,我猜这避免了快照可能出现的一些问题。
但现在我想对文件系统进行快照,然后将fs发送到具有较新版本mariadb的系统,但它无法启动:
Nov 24 02:55:51 test001 mariadbd[453773]: 2022-11-24 2:55:51 0 [ERROR] InnoDB: Upgrade after a crash is not supported. This redo log was created before MariaDB 10.2.2.
Nov 24 02:55:51 test001 mariadbd[453773]: 2022-11-24 2:55:51 0 [ERROR] InnoDB: Plugin initialization aborted with error Generic error
Nov 24 02:55:51 test001 mariadbd[453773]: 2022-11-24 2:55:51 0 [Note] InnoDB: Starting shutdown...
可是......"崩溃后升级......"为什么它会认为发生了崩溃?
如果要备份某些表,FLUSH TABLES WITH READ LOCK非常有用。当FLUSH TABLES WITH READ LOCK返回时,将阻止对表的所有写访问,并在磁盘上将所有表标记为"已正确关闭"。这些表仍可用于读取操作。
那么,为什么它认为发生了崩溃?我能做些什么来使快照更好,这样它就不会被视为"崩溃后升级"。或者有[简单]的方法来完成我正在尝试做的事情吗?
我试过使用FLUSH TABLES <list of all tables> FOR EXPORT
,但它似乎在5.5.56上不起作用。
1条答案
按热度按时间tag5nh1u1#
FLUSH TABLES WITH READ LOCK
不足以创建无崩溃快照,原因是此sql不会阻止InnoDB刷新线程应用先前的写入。好的方面是zfs快照是一致的。
所以你需要在副本上短暂地启动MariaDB-5. 5,然后让它干净地关闭。然后你就可以继续你的10. 2+版本了。
像podman这样的用户空间容器管理器,运行
docker.io/library/mariadb:5.5
容器,并将datadir作为-v /snapshot:/var/lib/mysql:Z
传入,然后停止(而不是终止)该容器。