我有一个非常大的表,让我们调用它example
,然后我尝试在该表上执行一些更改命令:
ALTER TABLE `example` ADD `example_column` TINYINT(1) NOT NULL DEFAULT 0;
Run Code Online (Sandbox Code Playgroud)
检查alter命令的进度:
mysql -e 'show engine innodb status \G' | grep 'undo \| log \| entries'
Run Code Online (Sandbox Code Playgroud)
给我很好的信息,关于时间 - 或多或少需要 17 天才能完成......
更改阻塞表,因此阻塞生产表 17 天不是一个好的选择。;)
我尝试在网上调查一些很棒的工具,例如:
我还阅读了文档和上述工具的限制部分:
触发器的使用意味着如果表上已经定义了任何触发器,则该工具将无法工作。
不提供任何改变包含外键的表的好方法
我的示例表有触发器和外键...
你能给我一些建议,如何处理这个改变?
我有 MySQL 5.6。我使用 GTID(基于行)复制。
我将非常感谢您的建议!
我使用的设置是主从复制配置中的 MySQL 5.5,但我们必须使用“混合”复制(基于语句和行),因为我们使用需要它的应用程序,并且它恰好在我们的同一台上服务器。
我们最近停止了复制,我想确保我们已正确恢复。
我下载并安装了 Percona Toolkit,但在这种情况下我似乎无法使用 pt-table-checksum,特别是因为基于行的复制:
2.27.5 限制使用基于行的复制 pt-table-checksum 的副本需要基于语句的复制,并且它在主服务器上设置 binlog_format=STATEMENT,但由于 MySQL 限制,副本不支持此更改。因此,校验和不会使用基于行的复制来复制任何副本,这些副本是进一步副本的主副本。该工具会自动检查所有服务器上的 binlog_format。请参阅 --[no]check-binlog-format 。(错误 899415)
是否有其他选项可以对基于行的复制表进行校验和?
我在 Percona 论坛上发现了这个,它说它可以工作,但我不能让它改变我的 cnf 文件,因为它声称它可以。当我尝试运行它时,它还会发出以下警告:
副本 mysql-b.example.com 具有 binlog_format MIXED,这可能会导致 pt-table-checksum 中断复制。请阅读该工具文档的限制部分中的“使用基于行的复制的副本”。如果您了解风险,请指定 --no-check-binlog-format 以禁用此检查。
我继承了一个 MySQL InnoDB 表,它包含大约 200 GB 的数据,以及几个大约 500 GB 的不需要的索引。我已经在场外存档了大约 75% 的记录并从我的表中删除了这些记录,并希望回收表中的空间。我想知道我是否需要大约 200 GB 的可用空间来回收空间,或者接近 700 GB。
innodb_file_per_table 已开启。
MySQL 版本是 5.5。
我正在考虑运行 OPTIMIZE TABLE(例如从表中删除行后恢复磁盘空间)或使用 Percona Toolkit 的在线模式更改(例如http://www.percona.com/blog/2013/09/25/how-to -reclaim-space-in-innodb-when-innodb_file_per_table-is-on/)。我更愿意做后者,因为我可以避免写锁,但如果需要相当大的空间差异,我会使用 OPTIMIZE TABLE。
我是否需要接近 200 GB 或接近 700 GB 的可用空间才能从 InnoDB 回收空间?如果接近 700GB,如果我首先将表转换为 MyISAM(例如http://www.percona.com/blog/2014/08/21/the-mysql-ibdata1-disk-space-issue -and-big-tables-part-1/)?
感谢您的帮助!
我已阅读pt-online-schema-change
文档并了解它的工作原理是创建触发器并在块时间秒内复制数据块(默认为 0.5 秒)
让我们考虑下面的情况。
我们有一个 5 GB 的表 TBL1,正在使用 PT-ONLINE-SCHEMA-CHANGE 进行更改
PT-ONLINE-SCHEMA-CHANGE 使用所需的更改创建了新表,在 TBL1 上添加了触发器并开始复制。
复制了 10 个数据块,并开始复制第 11 个数据块,其大小约为“X”MB。根据工具,该块最多可在 500 毫秒或 0.5 秒内复制
在第 11 个块复制期间,应用程序发出了一个 UPDATE,它必须修改属于第 11 个数据块的有效行。
我的问题是现在发生以下哪些事情。原始表现在发生?
A) Update will be blocked till the chunk be copied and then applied on original table
which gets updated through triggers on new one.
B) Update will be performed on original table and data chunk will be re copied all
over again.
Run Code Online (Sandbox Code Playgroud)
如果选项 A 是答案,那么 PT-ONLINE-SCHEMA-CHANGE 如何实现无锁? …
我使用了 pt-online-schema-change 但过程中途终止了。
该脚本会复制原始表,其名称后跟“_new”。
由于进程在中间终止,因此表“_new”未被删除,当我尝试删除它时,我的应用程序崩溃了。
似乎每当我更改原始表时,这个 _new 表也会更改,因此如果找不到它就会崩溃。
我想知道如何删除这个 _new 表。
mysql ×5
alter-table ×2
binlog ×1
innodb ×1
mysql-5.5 ×1
mysql-5.6 ×1
percona ×1
replication ×1