我正在对MySQL数据库进行更新,其中包括生成ALTER TABLE语句以及DIU语句(delete、insert、update)的MySQL脚本。
其思想是进行事务性更新,因此如果语句失败,则会进行回滚,但是如果我将ALTER TABLE语句或其他在http://dev.mysql.com/doc/refman/5.0/en/implicit-commit.html中指定的语句放在一起,则会进行隐式提交,因此不能进行完整的回滚,因为指定的操作仍然是提交的。
我试图使用mysqldump创建一个备份,以便在发生错误时使用(mysql将distinct返回为零),但它太慢了,而且也可能失败。
我能做什么?我需要这样做,以确保将来的更新是安全的,并且不会太慢,因为数据库包含30-100 GB的数据。
发布于 2012-08-08 11:53:12
转储和重新加载可能是替代alter table的最佳选择。
从mysql提示符或数据库脚本:
select * from mydb.myt INTO OUTFILE '/var/lib/mysql/mydb.myt.out';
drop table mydb.myt;
create tablemyt(your table ddl here)
load data infile '/var/lib/mysql/mydb.myt.out' INTO TABLE mydb.myt;
看看这个:
http://everythingmysql.ning.com/profiles/blogs/whats-faster-than-alter
我认为它为"alternatives to alter“提供了很好的指导。
发布于 2012-08-08 14:21:42
查看pt-online-schema change。
您可以将其配置为在联机ALTER完成后保留'old‘表。旧的表格将有一个下划线前缀。如果发生了不好的事情,请删除您更改过的表,并将旧的表重命名为原始表。如果一切正常,那么只需删除旧的表。
http://www.percona.com/doc/percona-toolkit/2.1/pt-online-schema-change.html
https://stackoverflow.com/questions/11857329
复制相似问题