虽然MySQL的导出很容易,但我有一个专用的在线MySQL服务器,想要设置复制。为此,我需要导出数据库并将其导入到复制从服务器中。
问题在于当我进行导出时,MySQL会全力以赴地使用资源,导致连接到它的网站受阻。我想知道是否有一种方法可以将导出查询限制在低优先级状态下,使活动连接更受优先?其想法是外部网站的负载不会受到MySQL全力导出的影响...
虽然MySQL的导出很容易,但我有一个专用的在线MySQL服务器,想要设置复制。为此,我需要导出数据库并将其导入到复制从服务器中。
问题在于当我进行导出时,MySQL会全力以赴地使用资源,导致连接到它的网站受阻。我想知道是否有一种方法可以将导出查询限制在低优先级状态下,使活动连接更受优先?其想法是外部网站的负载不会受到MySQL全力导出的影响...
我拥有非常大的数据库,其中有数万个表格,其中一些表格中的数据量高达数十亿条,每个表格都有 5GB 左右的数据。(我运行的是一个受欢迎的服务)... 当备份这些数据库时,我总是很头疼。使用默认的 mysqldump 工具会迅速让服务器负载失控并锁死一切... 影响我的用户。尝试停止进程可能会导致表崩溃,并在恢复这些表期间出现大量停机时间。
我现在使用...
mysqldump -u USER -p --single-transaction --quick --lock-tables=false DATABASE | gzip > OUTPUT.gz
从dev.mysql.com的mysqldump参考文档中可以看到...
为了备份大表,你应该将--single-transaction和--quick选项结合使用。
该文档并未说明这取决于数据库是否为InnoDB,我的数据库是myISAM,这对我来说非常有效。服务器负载几乎没有受到影响,在整个过程中我的服务都像劳力士一样运行良好。如果您有大型数据库,并且备份正在影响终端用户...那么这就是解决方案。 ;)
SELECT TABLE_NAME, ENGINE FROM information_schema.TABLES
或SELECT TABLE_NAME, ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA = '<您的数据库名称>'
来检查您的引擎。 - vladkras如果使用InnoDB表,请使用mysqldump的--single-transaction和--quick选项
--single-transaction
和--quick
的解决方案之外,我建议不要直接将结果导入gzip中,而是先将其转储为.sql文件,然后再进行gzip压缩(使用&&代替|)。df -h
检查免费磁盘空间!因为你需要的磁盘空间比管道 | gzip多。mysqldump --single-transaction --quick -u user -p my_db_name > dump_name.sql && gzip dump_name.sql
-> 这将导致生成名为dump_name.sql.gz的1个文件。
1) 首先,您需要查看您的MySQL版本。使用至少5.7版本以支持多线程。旧版本仅使用1个线程,如果您有大型数据库同时使用DB和执行mysqldump不是一个好主意。
2) 最好不要在同一DB磁盘上构建备份,因为读/写性能可能会受到影响,或者您可能需要RAID 10。
3) MySQL Enterprise的mysqlbackup更好,但需要付费,我不知道这是否适用于您。
4) 有时许多表不需要事务处理,因此只在需要的表上使用事务处理。
5) 通常需要事务处理,使用InnoDB格式以获得更好的性能并避免锁定表。
6) 在某些情况下,最好只编写一个程序,这样您可以仅针对读取表创建事务,而无需锁定任何人,并使用一些睡眠测试,以避免冻结您的服务。
您可以在mysqldump命令前加上以下内容:
ionice -c3 nice -n19 mysqldump ...
这将以低IO和CPU优先级运行,因此应该限制其影响。
请注意,这只会延迟MySQL执行之间的时间。脚本本身仍然像以前一样密集,只是脚本之间有更长的间隔。
nice -n 10 ionice -c2 -n 7 mysqldump db-name | gzip > db-name.sql.gz