MySQL 备份数据那点事

时间:2021-08-23 03:04:17

mysqldump

什么是 mysqldump ?

mysqldump 是 MySQL 用于执行逻辑备份的一款工具,可以根据原始数据库对象以及表的定义和数据来生成一系列可以被执行的 SQL 语句。
通常我们用它作为备份或者迁移数据。 mysqldump 命令还可以输出成 CSV 文件,其他边界的文本或者 XML 格式。

如何使用 mysqldump?

导出整个数据库(包含数据)

mysqldump -u username -p dbname > dbname.sql   

导出数据库结构

mysqldump -u username -p -d dbname > dbname.sql

导出数据库中的某张表

mysqldump -u username -p dbname tablename > tablename.sql

导出数据库中的某张表结构

mysqldump -u username -p -d dbname tablename > tablename.sql

导入数据

mysql -u username -p dbname < dbname.sql

也可以在 msyql CLI 中导入:
source /home/dbname.sql

mysqldump 的常见参数:

--single-transaction:
当设置此参数时,会将事务隔离模式设置为 REPEATABLE_READ 并在导出数据前,发送一个 START_TRANSACTION SQL语句到 MySQL Server 上。
此参数仅仅对事务表(如 InnoDB)有作用,因为在导出数据时,除了保证数据一致性的状态还能同时保证其他应用在开启事务是不会被阻塞。

需要注意的是,该参数只能保证 InnoDB 表导出数据时的一致性状态。对于MyISAM或者MEMORY的表在导出时,状态可能会发生改变。

当使用此次参数 mysqldump 正在导出数据时,为了确保得到有效的结果(正确的表内容和二进制坐标),要保证其他的连接使用 ALTER_TABLE, CREATE_TABLE, DROP_TABLE, RENAME_TABLE, TRUNCATE_TABLE 等操作。因为一致性的读不会隔离这些操作,所以当一个表被导出时会导致 mysqldump 使用 SELECT 操作会检索到不正确或者发生错误。

--single-transaction--lock-tables 是互斥的,如果指定 LOCK_TABLES 会导致对正在转储的数据进行锁定,仅允许读操作,直到所有的表被导出。

--quick:
该参数对转储大表时很有用.它会强制 mysqldump 一次从服务器中检索表中的一行,而不是检索整个行集并将其缓冲在内存中,然后再将其写出。

--flush-logs:
该参数的作用就是关闭当前使用的 binlog,然后创建一个新的 binlog 文件用于记录。

定期全量备份 MySQL

创建定期备份脚本

mkdir /home/mysql_backup
touch /home/mysql_backup/backup.log
touch /home/mysql_backup/MySQL_Full_Backup.sh
chomd 744 MySQL_Full_Backup.sh

MySQL_Full_Backup.sh 内容

#!/bin/bash
# use mysqldump to Fully backup mysql data per day!

# Path
BakDir=/home/mysql_backup
LogFile=/home/mysql_backup/backup.log

# get time
Date=`date  %Y%m%d_cmi`
Begin=`date  "%Y年%m月%d日 %H:%M:%S"`

# enter backup dir
cd $BakDir

# delete previous log files
deleted_log_file_name=$(ls *.sql.tgz)
/bin/rm $deleted_log_file_name

# set output filename
DumpFile=$Date.sql
GZDumpFile=$Date.sql.tgz

# Back up and compress files
/usr/bin/mysqldump --single-transaction -ucisco -pCiscoPass1!  cmi > $DumpFile
/bin/tar -zvcf $GZDumpFile $DumpFile
/bin/rm $DumpFile

# record log
Last=`date  "%Y年%m月%d日 %H:%M:%S"`
echo 开始:$Begin 结束:$Last $GZDumpFile succ >> $LogFile

每天 24 点执行

crontab -e
59 23 * * * /bin/sh /home/mysql_backup/MySQL_Full_Backup.sh
# 打开服务
systemctl restart crontab
systemctl enable crontab

参考

全量 增量备份

MySQL 备份的几种方式