mysqldump没有中断现场制作INSERT

时间:2012-03-28 10:24:21

标签: mysql mysqldump

我准备将我们的生产数据库迁移到另一台服务器。它大约38GB,它正在使用MYISAM表。由于我没有物理访问新服务器文件系统,我们只能使用mysqldump。

我查看了这个网站,看看mysqldump在线备份是否会打倒我们的生产网站。从这篇文章:Run MySQLDump without Locking Tables,它说明显mysqldump会锁定数据库并阻止插入。但经过几次测试后,我很想知道其他情况。

如果我使用

mysqldump -u root -ppassword --flush-logs testDB > /tmp/backup.sql

mysqldump最终会默认执行' - lock-tables ',这是一个 READ LOCAL 锁(refer to mysql 5.1 doc),其中并发插入仍然可用。我已经做了一个for循环,每秒插入一个表,而mysqldump需要一分钟才能完成。每一秒都会在此期间插入记录。这意味着,mysqldump不会中断生产服务器, INSERT仍然可以继续

有没有人有不同的经历?我想在继续我的生产服务器之前确保这一点,所以很高兴知道我做错了什么让我的测试不正确。

[我的mysql-server版本是5.1.52,mysqldump是10.13]

4 个答案:

答案 0 :(得分:2)

现在,您可能拥有一个带有析取表或数据仓库的数据库 - 其中所有内容都未规范化(根本没有),并且表之间没有任何链接。在这种情况下,任何转储都可以。

I ASSUME,包含38G数据的生产数据库包含某种形式的图形(BLOB),然后 - 无处不在 - 您有来自其他表的链接。正确?

因此,您 - 就我所见 - 有可能失去表之间的严重链接(通常是主键/外键对),因此,您可以在更新/插入时捕获一个表,虽然它的依赖(使用该表作为其主要来源)尚未更新。因此,您将失去所谓的数据库完整性。

通常,重建完整性非常麻烦,最常见的原因是系统使用/生成/维护数据库系统尚未成为面向事务的系统,因此无法跟踪数据库中的关系除了通过主/外键关系。

因此,你可能会在没有锁的情况下复制你的桌子以及上面提到的许多其他建议 - 但你有可能会烧伤你的手指,并且取决于系统操作的敏感程度 - 你可能严重烧伤或只是表面划伤。

示例:如果您的数据库是一个关键任务数据库系统,包含ICU中生命支持设备的推荐心率,我会在进行迁移之前考虑两次以上。

但是,如果数据库包含来自Facebook或类似网站的图片=您可能能够承受0到129,388个丢失链接的后果: - )。

现在 - 非常适合分析。解决方案:

您将需要创建一个软件,它为您完全完整性进行转储,由表集设置表,由元组组成元组。您需要识别可以从当前的24/7/365全基地复制到新基础的数据集,然后标记它已被复制。

IFFF现在对已经复制的记录进行更改,您需要对这些记录进行后续复制。这样做可能是一件棘手的事情。

IFFF您正在运行更高级版本的MYSQL - 您实际上可以创建另一个站点和/或副本或分布式数据库 - 然后以这种方式逃脱它。

IFFF你有一个10分钟的窗口,你可以根据需要创建它,然后你也可以复制位于驱动器上的物理文件。我在谈论.stm .std - 等文件 - 然后你可以关闭服务器几分钟,然后复制。

现在提出一个基本问题:

您需要不时对机器进行维护。您的系统没有为这种操作获得空间吗?如果没有 - 那么当硬盘崩溃时你会做什么?注意'何时' - 而不是'如果'。

答案 1 :(得分:1)

我以前从未这样做过,但你可以在转储时尝试--skip-add-locks

虽然可能需要更长时间,但您可以转储几个补丁,每个补丁都需要很短的时间才能完成。添加--skip--add-drop-table将允许您将这些多个较小的转储上载到同一个表中,而无需重新创建它。使用--extended-insert将使sql文件更小以启动。

可能会尝试类似mysqldump -u -p${password} --skip-add-drop-table --extended-insert --where='id between 0 and 20000' test_db test_table > test.sql的内容。您需要转储表结构并首先上传它们以便以这种方式执行,或者删除第一个转储的--skip-add-drop-table

答案 2 :(得分:1)

1)使用--opt与指定--add-drop-table--add-locks--create-options--disable-keys,{{ 1}},--extended-insert--lock-tables--quick--set-charset所代表的所有选项默认情况下都处于启用状态,因为默认情况下--opt处于启用状态。

2) mysqldump可以逐行检索和转储表内容,或者它可以从表中检索整个内容并在转储之前将其缓冲在内存中。如果要转储大型表,则在内存中缓冲可能会出现问题。要逐行转储表,请使用--opt选项(或--quick,启用--opt)。默认情况下启用--quick选项(以及--opt),因此要启用内存缓冲,请使用--quick

3) --skip-quick此选项在从服务器转储数据之前发出--single-transaction语句(事务表BEGIN SQL)。

如果您的架构是InnoDBInnoDB的组合,以下示例将对您有所帮助:

MyISAM

答案 3 :(得分:0)

mysqldump默认情况下不添加--lock-tables。尝试使用--lock-tables 如果有帮助,请告诉我

BTW - 您还应该使用添加锁,这将使您的导入更快!