加速 mysqldump / 重新加载

JSh*_*ean 4 mysql mysqldump backup

将大型模式转换为每个表文件,我将使用 --all-databases 执行 mysqldump/reload。我编辑了 my.cnf 并更改了“innod_flush_log_at_trx_commit=2”以加快加载速度。我计划“SET GLOBAL innodb_max_dirty_pages_pct=0;” 在转储之前的某个时刻。我很想知道哪种设置组合可以获得最快的转储和重新加载时间?

模式统计:

26 个 myisam 表 413 个 innodb ~240GB 数据

[--opt=--禁用键;--扩展插入;--快速等] --no-autocommit ??

与前置会话变量类似:“SET autocommit=0; SET unique_checks=0; SETforeign_key_checks=0;”

mysqldump 选项是否等效?

谢谢你的建议!

Rol*_*DBA 5

第 1 方面

虽然在转储之前将innodb_max_dirty_pages_pct设置为 0 是很好的做法,但您必须等到脏页计数低于 InnoDB 缓冲池大小的 1%。以下是衡量它的方法:

SELECT ibp_dirty * 100 / ibp_blocks PercentageDirty FROM
(SELECT variable_value ibp_blocks
FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_total') A,
(SELECT variable_value ibp_dirty
FROM information_schema.global_status
WHERE variable_name = 'Innodb_buffer_pool_pages_dirty') B;
Run Code Online (Sandbox Code Playgroud)

继续运行此报告,直到PercentageDirty接近 1.00。也许您可以innodb_max_dirty_pages_pct在转储前一小时将其设置为 0。

如果您不进行更改innodb_max_dirty_pages_pct,mysqldump 将强制刷新涉及您要转储的表的脏块。

第 2 方面

您不必添加前缀,"SET autocommit=0; SET unique_checks=0; SET foreign_key_checks=0;"因为 mysqldump 将它们包含在转储的开头。这是 mysqldump 的标头示例(请注意后面的两行TIME_ZONE

-- MySQL dump 10.11
--
-- Host: localhost    Database: dbAccessData
-- ------------------------------------------------------
-- Server version       5.0.51a-community-log

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Current Database: `dbAccessData`
--

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `dbAccessData` /*!40100 DEFAULT CHARACTER SET latin1 */;

USE `dbAccessData`;
Run Code Online (Sandbox Code Playgroud)

第 3 方面

请运行此查询

SELECT engine,count(1) table_count FROM information_schema.tables
WHERE table_schema='mysql' GROUP BY table_schema;
Run Code Online (Sandbox Code Playgroud)

我运行了这个,MySQL 5.5.23 得到了 25。由于您有 26 个表,因此在 mysql 模式之外只有 1 个表。要找到它,请运行以下命令:

SELECT table_schema,count(1) table_count FROM information_schema.tables
WHERE engine='MyISAM' GROUP BY table_schema;
Run Code Online (Sandbox Code Playgroud)

如果你停止写入一个单独的表,你应该能够很好地 mysqldump 所有数据库。

第 4 方面

所有需要的选项都--opt足够了。无需更改它。

第 5 方面

您可能想将数据库转储到不同的文件中:请参阅我的Apr 17, 2011帖子How can I Optimize a mysqldump of a Large Database? 关于如何编写并行 mysqldump 脚本。