如何不加锁使用mysqldump备份mysql数据库

默认情况下,mysqldump这个工具可以帮助你备份一个mysql数据库,在备份过程中它会把所有的表锁住,直到备份完成。

在许多时候,要备份的数据量和运行时间等等要求不允许加锁。因此备份数据需要通过其他方式来完成。

确实有其他方式。你可以在使用mysqldump这个工具的时候指定一个特定的flag,--single-transaction,这个标志的作用是可以让你在备份数据库的时候不加锁。

一些内部原理:在这个工具开始从服务器获取数据之前,它会发送一个START TRANSACTION命令,这个命令有两个目的。第一个是无论在备份开始之后数据库发生了什么改变,都可以确保从一个特定的时间点开始有一个一致性的备份。第二个是由于我们的备份操作是数据库事务的一部分,所以可以阻止加锁。

请注意这个标志只对事务型的表才起作用,比如InnoDB类型的表。它不会对诸如MyISAM和MEMORY等类型的表起作用。由于这些类型的表不是事务型的,它们在备份的过程中会改变状态。

还请注意如果你使用--single-transaction这个标志备份大型表,你应该考虑和--quick标志一起使用。--quick这个标志可以让mysqldump在备份的过程中一次只取一行数据,而不是把所有行都缓存到内存里,因为如果你没有足够的内存并且你的表太大可能会导致失败。

一键不加锁备份mysql数据库

#!/bin/bash
#mysqldump
#by www.totosay.com

echo -e "33[32m--------------------------------33[1m"
echo "system is starting,please wait...."
sleep 2

if [ $UID -ne 0 ];then
echo "must to be use root user"
exit 0
fi

MYSQL_USR=www_totosay_co
MYSQL_PW=rFXkDJWXMA4XfsAf
MYSQL_DB=www_totosay_co
MYSQL_DIR=/www/backup/database
MYSQL_CMD=/www/server/mysql/bin/mysqldump


TOTIM=$(date +%Y%m%d)
DIRBAK_NAME=$MYSQL_DIR
SQLBAK_NAME=$MYSQL_DB$TOTIM.sql
ZIPBAK_NAME=$MYSQL_DB$TOTIM.zip



$MYSQL_CMD -u$MYSQL_USR -p$MYSQL_PW --skip-lock-tables $MYSQL_DB > $MYSQL_DIR/$SQLBAK_NAME
if [ $? -eq 0 ];then
echo "mysqldump is successfully"
fi

cd $DIRBAK_NAME
zip $ZIPBAK_NAME $SQLBAK_NAME
rm -f $SQLBAK_NAME
if [ $? -eq 0 ];then
echo -e "33[37m--------------------------------33[1m"
echo "mysqzip is successfully"
fi