ParoX Asked: 2020-12-11 09:53:17 +0800 CST2020-12-11 09:53:17 +0800 CST 2020-12-11 09:53:17 +0800 CST 我可以禁用二进制日志以暂时节省空间吗 772 我正在使用 percona mysql 8。 我不使用任何类型的复制,但我读到二进制日志对于数据恢复很有用。我想在运行pt-online-schema-change不影响 OPTIMIZE 表时关闭 binlogging 并刷新它们。 完成后,我想重新打开 binlogging(然后努力移动到有更多空间的服务器)。 这是安全和推荐的吗?我需要优化一个表并且不能脱机,除非我删除 50GB 的二进制日志,否则制作表的副本会使我空间不足 mysql percona 3 个回答 Voted Best Answer RolandoMySQLDBA 2020-12-11T10:20:22+08:002020-12-11T10:20:22+08:00 当您使用set-vars启动 pt-online-schema-change 时,您需要做的是设置sql_log_bin为 0 pt-online-schema-change --set-vars sql_log_bin=0 您的二进制日志永远不会知道其中的区别。 请确保您有足够的空间用于临时表 ( _tablename_new)。 更新 2020-12-10 14:45 EST 如果您不在此服务器上进行备份,那么您可以运行 PURGE BINARY LOGS BEFORE CURDATE() - INTERVAL 5 DAY; 保留最后 5 天的二进制日志,或者如果您希望所有二进制日志都消失,然后运行 RESET MASTER; 警告 !!! 在此之前,请确定服务器是否作为主服务器运行复制。 更新 2020-12-10 16:05 EST 由于您正在运行 pt-online-schema-change,因此您应该像这样运行它 pt-online-schema-change --set-vars sql_log_bin=0 --alter "ENGINE=InnoDB" 这只会创建一个碎片整理的临时表。碰巧--analyze-before-swap是默认值。这意味着ANALYZE TABLE在交换旧表和新表之前,临时表已对其执行。OPTIMIZE TABLE这与InnoDB 表具有完全相同的效果。 正如nbk 的评论中提到的,您应该确保有备份。通过设置复制并从从属设备进行备份,您还可以为自己创造一个美好的世界。 Jehad Keriaki 2020-12-11T13:22:32+08:002020-12-11T13:22:32+08:00 简短的回答是,不,它不安全,不推荐。 我了解这些日志不是用于复制,而是用于数据恢复。这些对于执行“时间点”恢复很有用。但是,您必须有一个有效的先前完整备份才能使二进制日志有用。 我的建议: 对您的数据库进行完整备份 [使用 mysqldump 或任何其他方式] 刷新日志[并标记时间] 将 binlogs 文件复制到安全的地方 [备份它们] 在标记时间之前清除二进制日志 运行您的优化语句。在此期间,binlogs 仍然会被写入,但大小会最小 高温高压 Rick James 2020-12-20T10:17:57+08:002020-12-20T10:17:57+08:00 当删除一张大表的很多行时,这样做效率更高 CREATE TABLE new LIKE real; INSERT INTO new SELECT ... (the rows to keep); -- the slow part RENAME TABLE real TO old, new TO real; -- fast, atomic DROP TABLE old; 如果原始表是用 构建的innodb_file_per_table=ON,那么这个过程将把空闲空间还给操作系统;不需要OPTIMIZE。 比INSERT..SELECT(每行)快得多DELETE。 如果您要删除“旧”数据并且需要再次清除,请考虑分区。 有关这些和其他删除技术的更多详细信息:http: //mysql.rjweb.org/doc.php/deletebig binlog中的空间—— DELETEwith binlog_format = ROW: 每行删除一个条目。 DELETEwith STATEMENT:整个语句的一个条目。 INSERT: 每行一个条目。 OPTIMIZE:(我认为)整个声明的一个条目。 也就是说,这就是DELETE使二进制日志膨胀的原因。OPTIMIZE很长一段时间都在锁定桌子。
当您使用set-vars启动 pt-online-schema-change 时,您需要做的是设置
sql_log_bin
为 0您的二进制日志永远不会知道其中的区别。
请确保您有足够的空间用于临时表 (
_tablename_new
)。更新 2020-12-10 14:45 EST
如果您不在此服务器上进行备份,那么您可以运行
保留最后 5 天的二进制日志,或者如果您希望所有二进制日志都消失,然后运行
警告 !!!
在此之前,请确定服务器是否作为主服务器运行复制。
更新 2020-12-10 16:05 EST
由于您正在运行 pt-online-schema-change,因此您应该像这样运行它
这只会创建一个碎片整理的临时表。碰巧--analyze-before-swap是默认值。这意味着
ANALYZE TABLE
在交换旧表和新表之前,临时表已对其执行。OPTIMIZE TABLE
这与InnoDB 表具有完全相同的效果。正如nbk 的评论中提到的,您应该确保有备份。通过设置复制并从从属设备进行备份,您还可以为自己创造一个美好的世界。
简短的回答是,不,它不安全,不推荐。
我了解这些日志不是用于复制,而是用于数据恢复。这些对于执行“时间点”恢复很有用。但是,您必须有一个有效的先前完整备份才能使二进制日志有用。
我的建议:
高温高压
当删除一张大表的很多行时,这样做效率更高
如果原始表是用 构建的
innodb_file_per_table=ON
,那么这个过程将把空闲空间还给操作系统;不需要OPTIMIZE
。比
INSERT..SELECT
(每行)快得多DELETE
。如果您要删除“旧”数据并且需要再次清除,请考虑分区。
有关这些和其他删除技术的更多详细信息:http: //mysql.rjweb.org/doc.php/deletebig
binlog中的空间——
DELETE
withbinlog_format = ROW
: 每行删除一个条目。DELETE
withSTATEMENT
:整个语句的一个条目。INSERT
: 每行一个条目。OPTIMIZE
:(我认为)整个声明的一个条目。也就是说,这就是
DELETE
使二进制日志膨胀的原因。OPTIMIZE
很长一段时间都在锁定桌子。