MySQL中的事务性ALTER语句

时间:2012-08-08 03:36:15

标签: mysql sql database rollback transactional

我正在对MySQL数据库进行更新,其中包括制作ALTER TABLE语句的MySQL脚本,以及DIU句子(删除,插入,更新)。

这个想法是进行事务性更新,所以如果一个句子失败,就会进行回滚,但是如果我把http://dev.mysql.com/doc/refman/5.0/en/implicit-commit.html中指定的ALTER TABLE语句或其他内容设置为隐式提交,那么我就不能进行完全回滚,因为指示的操作仍然被提交。

我尝试使用mysqldump进行备份,在出现错误时使用(mysql将其返回到零),但它太慢而且也可能失败。

我该怎么办?我需要这样做以确保未来的更新是安全的而不是太慢,因为数据库包含30-100 GB的数据。

2 个答案:

答案 0 :(得分:1)

转储和重新加载可能是您的最佳选择,而不是alter table

从mysql提示符或从数据库脚本:

select * from mydb.myt INTO OUTFILE '/var/lib/mysql/mydb.myt.out';
drop table mydb.myt;
create table
{MYT {1}}

检查出来:

http://everythingmysql.ning.com/profiles/blogs/whats-faster-than-alter

我认为它为“改变替代品”提供了很好的指导。

答案 1 :(得分:0)

查看pt-online-schema更改。

您可以将其配置为在完成在线ALTER后保留“旧”表格。旧表将具有下划线前缀。如果发生错误,请删除您更改的表,并将OLD表重命名为原始表。如果一切正常,那么只需删除旧表即可。

http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html