Mic*_*ski 72
在mysql
命令行客户端将接受来自标准输入的SQL语句的流.因此,您可以将输出mysqldump
直接传递到mysql
命令行.将此作为cron作业将定期使用更新的实时数据覆盖您的测试数据:
mysql --user=username --password=passwd -e 'DROP DATABASE test_db;'
mysql --user=username --password=passwd -e 'CREATE DATABASE test_db;'
mysqldump --user=username --password=passwd live_db | mysql --user=username --password=passwd test_db
Run Code Online (Sandbox Code Playgroud)
请注意,由于您的数据很大,因此需要很长时间.
迈克尔斯回答abowe运作良好,但不复制事件,存储过程或触发器.
要复制那些mysqldump需要更多的开关:
--events --triggers --routines
补充已经制作的副本:
mysqldump --user=username --password=passwd --no-data --no-create-info --no-create-db --events --triggers --routines live_db | mysql --user=username --password=passwd test_db
我多年来一直在不同的环境中使用中小型数据库(1 G 到 100 G)进行此操作。mysqldump
对于较小的数据集来说,快速而肮脏的工作;它们越小,效果就越好。
当你超过 5-10 GB 时,根据 MySQL 负载,快速和肮脏就不再有效。
mysqldump
可能还不够MySQLdump 的问题在于,当它转储时,实时数据库要么无法使用,使用起来很尴尬,要么备份不一致。除非您有足够宽的时间窗口,否则实时数据库的不可用性并不重要,因为数据库无论如何都不需要使用(例如,深夜)。
默认选项(这里讨论原因)使数据库在转储时几乎无法使用,除非用途只是读取数据,而且很少。在繁忙的电子商务网站上,您会看到客户端堆积崩溃。
所以你使用 InnoDB 和现代选项(据我所知,不是默认值)
--single-transaction --skip-lock-tables
Run Code Online (Sandbox Code Playgroud)
这允许站点在转储期间运行,尽管比正常情况慢。根据使用情况,它可能会明显变慢。
当您这样做时,还可以转储其他可能重要的数据:
--events --triggers --routines
Run Code Online (Sandbox Code Playgroud)
(...哦,这仍然不会转储用户权限。用作测试也许并不那么重要)。
我发现了一个“建议”(!)作为“伟大的黑客”的解决方法,它基本上禁用了事务完整性,允许数据库在转储时全速运行。有点像卸下汽车的刹车以减轻重量并让它跑得更快,是的,它会起作用,但它会产生一些您可能不会立即注意到的副作用。您几乎肯定迟早会注意到它们 - 就像刹车一样,这将是您最需要它们的时候,而且它不会很漂亮。
但是,对于测试数据库,它仍然可以工作。
如果您有一个“严肃”的数据库,那么为什么不进行“严肃”的备份呢?
如果您有空闲空间(现在 20 GB 已经不多了),另一种可能性是使用辅助数据库。
您可以在同一服务器上的不同端口上安装MySQL 服务器的第二个副本,并将其作为从属服务器(该服务器将在存储速度方面受到性能影响)。然后您将拥有两个相同的数据库(实时主数据库,实时从数据库)。第一次,您仍然需要运行完整转储以使它们同步,并处理其中涉及的所有问题。
当您需要克隆测试数据库时,停止从属复制 - 实时从属现在将保持“冻结”状态 - 并使用 MySQLbackup 或仅复制数据文件将实时从属备份到测试数据库。完成后,您可以重新启动复制。
对实时主服务器的影响可以忽略不计,并且从服务器实际上可以用于非更新关键的选择。
归档时间: |
|
查看次数: |
40411 次 |
最近记录: |