Kee*_*ero 9 mysql database database-administration
我编写了一个备份shell脚本来执行mysqldump.
mysqldump -u$BACKUP_USER -p$BACKUP_PASS --flush-logs --lock-tables $DB_NAME > $SQL_FILE
Run Code Online (Sandbox Code Playgroud)
我的db的存储ENGINE是MyISAM.所以我不能使用--single-transaction
选项.该--lock-tables
只锁定在正在进行的mysqldump一个表.我的MySQL实例中有很多数据库,我不想使用--lock-all-tables
,它会锁定在我的服务器上运行的所有数据库.那么,如何在同一时间锁定一个mysql数据库中的所有表,以便我可以转储它?
到目前为止,这不是最漂亮的解决方案,但这很有效.我有同样的需求,这是我的解决方案,稍加修改以匹配您的变量名称.我假设你在Linux上运行MySQL,因为这在很大程度上依赖于shell BASH语义.如果你在Windows上,这可能不起作用.
# Mysql script to lock all tables in one DB
# (such as to get a consistent export dump of one database)
MYSQLCMD="mysql -u$BACKUP_USER -p$BACKUP_PASS -A"
function lock_db {
[ -e "/tmp/mysql-db-lock-${1}" ] && rm "/tmp/mysql-db-lock-${1}"
mkfifo "/tmp/mysql-db-lock-${1}"
(
(
echo "SELECT CONCAT( 'LOCK TABLES '
, GROUP_CONCAT(CONCAT('\`',table_name,'\`'),' WRITE')
, ';'
) AS \"-- Statement to lock tables\"
FROM information_schema.tables
WHERE table_schema='${1}'
ORDER BY table_name;
" | $MYSQLCMD
echo "\! cat '/tmp/mysql-db-lock-${1}' >/dev/null"
echo 'UNLOCK TABLES;'
) | $MYSQLCMD -D"${1}"
rm "/tmp/mysql-db-lock-${1}"
) &
}
function unlock_db {
>"/tmp/mysql-db-lock-${1}"
}
# Lock one database, all tables
lock_db $DB_NAME
# Verify locks have been placed
echo "SHOW OPEN TABLES WHERE in_use != 0" | $MYSQLCMD
# Do whatever here that you needed the locked db for
mysqldump -u$BACKUP_USER -p$BACKUP_PASS $DB_NAME > $SQL_FILE
# Release locks
unlock_db $DB_NAME
# Verify locks released
echo "SHOW OPEN TABLES WHERE in_use != 0" | $MYSQLCMD
Run Code Online (Sandbox Code Playgroud)
你应该看看这个选项.
FLUSH TABLES WITH READ LOCK
关闭所有打开的表并使用全局读锁锁定所有数据库的所有表.这是一种非常方便的备份方式......
http://dev.mysql.com/doc/refman/5.0/en/flush.html
这是我如何做到的。它应该适用于所有情况,因为它使用FLUSH TABLES WITH READ LOCK
.
#!/bin/bash
DB=example
DUMP_FILE=export.sql
# Lock the database and sleep in background task
mysql -uroot -proot $DB -e "FLUSH TABLES WITH READ LOCK; DO SLEEP(3600);" &
sleep 3
# Export the database while it is locked
mysqldump -uroot -proot --opt $DB > $DUMP_FILE
# When finished, kill the previous background task to unlock
kill $! 2>/dev/null
wait $! 2>/dev/null
echo "Finished export, and unlocked !"
Run Code Online (Sandbox Code Playgroud)
shellsleep
命令只是为了确保在mysqldump启动之前执行运行mysql锁定命令的后台任务。您可以将其减少到 1 秒,它应该仍然可以。将其增加到 30 秒并尝试在这 30 秒内从另一个客户端的任何表中插入值,您会看到它被锁定。
使用此手动后台锁定有两个优点,而不是使用mysqldump
选项--single-transaction
和--lock-tables
:
mysqldump
在同一锁定期间,您还可以运行其他命令。例如,当在主节点上设置复制时,它很有用,因为您需要SHOW MASTER STATUS;
在您创建的转储的确切状态(解锁数据库之前)获取二进制日志位置,以便能够创建复制从属。 归档时间: |
|
查看次数: |
19976 次 |
最近记录: |