mysql数据库备份及数据的导入导出
常用的备份方式及特性
- mysqldump (备份方式灵活、恢复时业务不停、备份速度慢)
- xtrabackup(物理、恢复时业务需停、备份速度快)
- mydumper(逻辑)
- mysqlbackup Enterprise (no lock)
mysqldump
- 备份的方式的粒度(库、表)
- 备份需要注意的事项
备份锁表,影响业务
对I/O,CPU,内存要求高
备份会不一致(一定要加single-transaction参数) - 缺点
花费时间比物理备份的二进制文件复制长
需要的存储空间更大
数据量大时恢复时间长
如果经常要备份,并希望在系统出现故障后快速恢复,或者需要通过网络传输备份文件,那么时间成本会非常大
使用mysqldump可以备份所有数据库,特定的数据库,特定的数据集合,甚至还可以备份指定数据库中的某些表
shell> mysqldump [options] db_name [tbl_name ...]
shell> mysqldump [options] --databases db_name ...
shell> mysqldump [options] --all-databases
选项 | 作用 |
–add-drop-database | 在每个数据库前包含一个 DROP DATABASE 语句 |
–add-drop-table | 在每个表之前包含一个 DROP TABLE 语句 |
–add-locks | 在被包含的表前面加上 LOCK TABLES ,后面加上UNLOCK TABLES |
–all-databases | 包含所有数据库 |
–create-options | 在create table语句中包含所有特定于mysql的表选项 |
–databases | 只包含数据库的列表 |
–delete-master-logs | 在master上,在执行备份后删除二进制日志 |
–events | 备份被包含的数据库中的事件 |
–extend-insert | 另一种将所有的记录作为VALUES字句的insert语法 |
–flush-logs | 在开始备份前刷新日志文件 |
–flush-privileges | 在备份mysql数据库后包含一个flush privileges 语句 |
–ignore-table | 不备份指定的表 |
–lock-all-tables | 在转储过程中锁定所有数据库中的所有表 |
–lock-tables | 锁定所有表 |
–log-error=filename | 将警告和错误追加到指定文件中 |
–replace | 重复数据先删除在插入 |
–no-create-db | 不要创建数据库语句 |
–no-create-info | 不要编写重新创建每个转储表的CREATE TABLE语句 |
–set-gtid-purged | 恢复时报错,将gtid忽略 |
–skip-add-drop-table | 不要在每个CREATE TABLE语句之前添加DROP TABLE语句 |
–no-data | 不写入任何表的行信息(只包含CREATE TABLE语句) |
–quick | |
–skip-quick | 业务不繁忙,数据量小,基本没有差别 |
–single-transaction | 在备份开始时发出begin语句,指示innodb存储引擎以一致性读的方式读取表,数据备份时被冻结,不能使用DDL语句 |
–master-data=2 | 结果中包含二进制日志文件名及其位置(CHANGE master),1的时候语句就不是注释状态 |
–skip-lock-tables | |
–result-file | 结果输出到指定文件 |
–triggers | 包含触发器 |
–routines | 包含存储程序(过程和函数) |
–where=‘condition’ | 只包含在condition中被选中的行 |
–xml | 生成XML输出结果 |
注意
由于mysqldump备份是逻辑的,还原数据库或者表的时候,有可能数据太大导致报错
sqlcmd
sqldumpsplitter这个工具可以将data数据切分成多个,在导入即可
mysqldump备份脚本
#!/bin/bash
USER="" #数据库用户
PASS="" #数据库用户密码
HOST="" #数据库主机IP
DEST="" #备份路径
# 删除几天之前的备份文件
DAYS=3
# 命令位置
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
GZIP="$(which gzip)"
# 格式化输出时间格式
NOW="$(date +"%Y-%m-%d_%s")"
# 创建目录
MBD="$DEST/$NOW/mysql"
install -d $MBD
# 跳过哪些数据库的备份
SKIP="information_schema
mysql"
# 得到目标机器上所有数据的名字
DBS="$($MYSQL -h $HOST -u $USER -p$PASS -Bse 'show databases')"
# 备份数据库,循环比对数据库名字在不在$SKIP中,如在其中就不备份
for db in $DBS
do
skipdb=-1
if [ "$SKIP" != "" ];
then
for i in $SKIP
do
[ "$db" == "$i" ] && skipdb=1 || :
done
fi
if [ "$skipdb" == "-1" ] ; then
FILE="$MBD/$db.sql"
$MYSQLDUMP -h $HOST -u $USER -p$PASS $db > $FILE
fi
done
# 压缩备份目录
cd $DEST
tar -cf $NOW.tar $NOW
$GZIP -9 $NOW.tar
rm -rf $NOW
# 删除$DAYS天前的数据
find $DEST -mtime +$DAYS -exec rm -f {} \;