MySql备份工具之Mysqldump

By | 2019年 11月 16日

一:mysqldump是mysql自带的一个具备简单数据备份和恢复功能的命令,可以实现将MySQL数据的数据备份成SQL文件,然后copy到其他MySQL服务器使用mysqldump命令进行数据还原,适用于备份数据量不是很大的业务场景,例如10G左右的场景,基本的使用方法如下:

1.1:命令的基本使用:

1.1.1:只备份指定的单个库,如果备份全部的库备份时间慢而且导入时间慢,并且另外的服务器可能还用不上:

[root@sql-slave ~]# /usr/local/mysql/bin/mysqldump -S /var/lib/mysql/mysql.sock -uroot -p123456 testdatabase > testdatabase_bak.sql
Warning: Using a password on the command line interface can be insecure.
[root@sql-slave ~]# egrep -v "#|\*|^$" testdatabase_bak.sql #查看备份文件而不显示注释信息

1.1.2:-B:在备份的时候添加-B的参数,是为了增加在在创建数据库和使用数据库的语句,如下:

[root@sql-slave ~]# /usr/local/mysql/bin/mysqldump -S /var/lib/mysql/mysql.sock -B  -uroot -p123456 testdatabase > testdatabas_1.sql

#不加-B的效果:

#加-的效果:

1.1.3:–compact:将备份后的文件注释信息减少的最少,很多注释信息不被写入文件,因此文件大小将减小很多,一般用于测试:

root@sql-slave ~]# /usr/local/mysql/bin/mysqldump -S /var/lib/mysql/mysql.sock -B --compact  -uroot -p123456 testdatabase > testdatabas_2.sql

1.1.4:压缩备份的文件后的sql文件:

[root@sql-slave ~]# /usr/local/mysql/bin/mysqldump -S /var/lib/mysql/mysql.sock -B --compact  -uroot -p123456 testdatabase | gzip  > testdatabas_2.sql.gz

1.1.5:分库备份,数据库有点儿多的话一个个备份太慢,全部备份不好恢复,就写了一个脚本,自动按库名分类备份,这样便于后期只有某个库出现问题的时候恢复数据,而且还不影响其他的库:

#!/bin/sh
#Author:ZhangJie
BAK_TIME=$(date  +%Y-%m-%d_%H:%M:%S)
USER_PSWD=123456
USER_NAME=root
SOCKET="/var/lib/mysql/mysql.sock"
MYLOGIN="mysql -u${USER_NAME} -p${USER_PSWD} -S ${SOCKET}"
DUMP_CMD="/usr/local/mysql/bin/mysqldump -u${USER_NAME} -p${USER_PSWD} -S${SOCKET} -B"
DATABASE="$($MYLOGIN -e "show databases;"|egrep -vi "_schema|mysql")" #不备份的数据库列表写在这里,自带的mysql、test等可以不备份

for dbname in ${DATABASE}
  do
   MYDIR=/data/backup/${dbname}
   [ ! -d ${MYDIR} ] && mkdir -p ${MYDIR}
 $DUMP_CMD ${dbname}|gzip >${MYDIR}/${dbname}_${BAK_TIME}.sql.gz
done

#备份效果如下:

1.1.6:通过参数备份,可以接收多个不固定的参数,将传递的参数作为数据库进行备份:

#!/bin/sh
#Author:ZhangJie
BAK_TIME=$(date  +%Y-%m-%d_%H:%M:%S)
USER_PSWD=123456
USER_NAME=root
SOCKET="/var/lib/mysql/mysql.sock"
MYLOGIN="mysql -u${USER_NAME} -p${USER_PSWD} -S ${SOCKET}"
DUMP_CMD="/usr/local/mysql/bin/mysqldump -u${USER_NAME} -p${USER_PSWD} -S${SOCKET} -B"
DATABASE=$* #接收所有的参数

for dbname in ${DATABASE} #循环参数
  do
    MYDIR=/data/backup/${dbname}
    [ ! -d ${MYDIR} ] && mkdir -p ${MYDIR}
    $DUMP_CMD ${dbname}|gzip >${MYDIR}/${dbname}_${BAK_TIME}.sql.gz
done

#通过传递蚕食备份数据库的备份结果:

1.2:针对表的备份:

1.2.1:备份指定的多个多个表,即不备份一个库里面所有的表:

[root@sql-slave ~]# /usr/local/mysql/bin/mysqldump -uroot -hlocalhost -p123456 -S /var/lib/mysql/mysql.sock    testdatabase testtable testtableN > /opt/test_table_bak.sql

1.2.2:只备份一个数据里面的表结构,可以理解为将创建表的语句备份:

[root@sql-slave ~]# /usr/local/mysql/bin/mysqldump -uroot -hlocalhost -p123456 -S /var/lib/mysql/mysql.sock -B  -d  testdatabase   > /opt/test.sql

#备份文件的 效果:

1.2.3:只备份表中的数据,即不包含表结构:

[root@sql-slave ~]# /usr/local/mysql/bin/mysqldump -uroot -hlocalhost -p123456 -S /var/lib/mysql/mysql.sock  --compact  -B  -t  testdatabase   > /opt/test.sq

#备份的数据结果::

1.3:记录MSQYL服务的日志文件及POS位置,用于配置Slave同步的时候使用:

[root@sql-master ~]# /usr/local/mysql/bin/mysqldump -uroot -hlocalhost -p123456  --master-data=2  -B   testdatabase   > /opt/test_table_bak.sql

#日志文件和POS位置记录结果如下:

1.4:mysqldump的时候,要去掉drop table的语句,默认导出表的时候会在每个表的前面加上drop table的语句,即导出的sql文件在别的服务器导入时会直接删除该服务器已经存在同名的table而导致会丢失数据,因此在Master或者其他MySQL服务器使用mysqldump导出数据的时候要将默认添加的drop-table去掉,如下:

1.4.1:默认是开启添加drop-table语句的:

[root@sql-master ~]# mysqldump --help | grep  drop-table
  --add-drop-table    Add a DROP TABLE before each create.
                      (Defaults to on; use --skip-add-drop-table to disable.)
                      options --skip-add-drop-table --skip-add-locks
  --opt               Same as --add-drop-table, --add-locks, --create-options,
  --skip-opt          Disable --opt. Disables --add-drop-table, --add-locks,
add-drop-table                    TRUE

1.4.2:默认导出的sql文件内容:

[root@sql-master ~]# /usr/local/mysql/bin/mysqldump --single_transaction --flush-logs --master-data=2 --lock-tables > /backup.sql
[root@sql-master ~]# /usr/local/mysql/bin/mysqldump   -uroot -p123456 --all-databases  --single_transaction --flush-logs --master-data=2 --skip-add-drop-table --lock-tables > /backup1.sql

1.4.3:备份所有的数据库:

[root@sql-master ~]#/usr/local/mysql/bin/mysqldump   --all-databases  --single_transaction --flush-logs --master-data=2 --lock-tables > /backup.sql

1.5:推荐使用的命令:

1.5.1:推荐备份的命令:

/usr/local/mysql/bin/mysqldump -u xx  -p xx  -Sxx  -B --master-data=2 --single_transaction --flush-logs --skip-add-drop-table  [要执行的操作]

1.5.2:推荐使用分库备份的脚本:

#!/bin/sh
#Author:ZhangJie
BAK_TIME=$(date  +%Y-%m-%d_%H:%M:%S)
USER_PSWD=123456
USER_NAME=root
SOCKET="/var/lib/mysql/mysql.sock"
MYLOGIN="mysql -u${USER_NAME} -p${USER_PSWD} -S ${SOCKET}"
DUMP_CMD="/usr/local/mysql/bin/mysqldump -u${USER_NAME} -p${USER_PSWD} -S${SOCKET} -B --master-data=2 --single_transaction --flush-logs --skip-add-drop-table"
DATABASE="$($MYLOGIN -e "show databases;"|egrep -vi "_schema|mysql")"

for dbname in ${DATABASE}
  do
   MYDIR=/data/backup/${dbname}
   [ ! -d ${MYDIR} ] && mkdir -p ${MYDIR}
 $DUMP_CMD ${dbname}|gzip >${MYDIR}/${dbname}_${BAK_TIME}.sql.gz
done

1.6:比较常用的命令:

show processlist; #查看数据库里正在执行的SQL语句,可能无法看全完整的SQL语句。
show full processlist; 	#查看正在执行的完整SQL语句,完整显示。
set global key_buffer_size = 1024*1024*32;	#不重启数据库调整数据库参数,直接生效,重启后失效。
show variables;	#查看数据库的配置参数信息,例如:my.cnf里参数的生效情况。
kill id  杀掉线程的命令,id为线程号(mysql下)
show status  查看当前会话的数据库状态信息。
show global status 查看整个数据库的运行状态信息。很重要,要分析并要做好监控。
show engine innodb status 显示innodb引擎的性能状态

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注