我曾经incron
为一个网站创建备份,并且我喜欢在我的脚本运行时将所有请求重定向到另一个网站。
到目前为止,我所做的是……
incron
每次更新 中的文件时都会运行一些脚本/var/www
。首先,它会向数据库添加一些条目。然后,它会使用 进行 gnu 增量备份tar
。之后,它会mysqldump
提取数据库并gzip
压缩 sql 文件。
现在我也想将统计数据添加到我的数据库中。我正考虑将其添加 /var/log/apache2/access.log
到incron
。
但这样我会弄乱我的数据库备份。我需要一种安全的方法来提取我的数据库,而无需关闭apache
或关闭mysql
。我可以阻止对 mysql 的写访问,但我的网站仍然可用,同时我无法更新统计数据而不会出现错误。
只要我的脚本正在运行,有没有办法重定向一个域的所有访问?也许mod_rewrite
有一些if
,但我必须使用哪些参数呢?
说实话,我不知道如何存档这个,我很高兴听到一些建议。
Apache 2.4.10
MySQL 5.7
Debian Jessie
答案1
我需要一种安全的方法来提取我的数据库,而无需关闭 Apache 或 MySQL。
我觉得你只是想避免任何修改到你的数据库在备份期间,以保持一致性。如果所有内容都在一个数据库中,那么你的重定向场景可能会过于复杂。MySQL 5.7 参考手册mysqldump
帮助我们:
对于每个转储的数据库,在转储之前锁定所有要转储的表。表被锁定以
READ LOCAL
允许在表的情况下进行并发插入MyISAM
。对于诸如 之类的事务表InnoDB
,--single-transaction
是比 更好的选择,--lock-tables
因为它根本不需要锁定表。由于
--lock-tables
对每个数据库单独锁定表,因此此选项不能保证转储文件中的表在数据库之间逻辑上一致。不同数据库中的表可能以完全不同的状态转储。此选项将事务隔离模式设置为可重复读,并发送开始交易SQL 语句在转储数据之前发送到服务器。它只对事务表有用,例如
InnoDB
,因为它会在转储数据时转储数据库的一致状态开始交易是在没有阻止任何应用程序的情况下发布的。使用此选项时,应记住,只有
InnoDB
表才会以一致状态转储。例如,使用此选项时转储的任何表MyISAM
或MEMORY
表仍可能改变状态。