MySQL的逻辑备份mysqldump及自动化备份脚本

连接参数

-u

-p

-S --socket

-h --host

-P --port

--database

备份示例:

mysqldump -uabc -p'43df.com' -S /xxxx/3306/mysql.sock --databases db_a db_b >/.../xx.sql

上述示例简单有效,但锁库锁表,避免用于生产环境

可输出为定界格式文件,相关参数:--fields-terminated-by 。。。。

恢复示例:

mysql -uabc -p'43df.com' -S /xxxx/3306/mysql.sock db_b

 

常用参数: -? --help

--default-character-set 默认utf8

-A --all-databases

-B --databases 如果只备份一个库,可以省略,但不会有建库语句

--tables 格式:库名 表名 默认覆盖-B

-w --where 只导出符合条件的记录

-l --lock-tables 锁表,省略情况下默认开启锁表,不能写入

--single-transaction

1、导出时建立一致性快照,表对象导出在一个事物中,不锁表

2、只支持有限存储引擎(InnoDB),因为要求支持事务

3、其他连接不能进行DDL操作

-d --no-data 只导对象结构,不导数据

-t --no-create-info 不导机构不导结构

-f --force 遇到错误也执行

-F --flush-logs 执行导出前先刷新日志文件,可能触发多次刷新,如果全库导出,建议先刷新

-e --extended-insert mysql独有的insert语法,默认开启,一条insert对应多个values,效率高,非标准SQL语法;如果需要将导出的sql应用到其他数据库,需要禁用,设置参数值为false

--dump-slave 用于生成slave备份集,会将当前的二进制文件及日志记录位置也输出到sql脚本

1:输出信息包括CHANGE MASTER

2:输出信息包括CHANGE MASTER,但被注释掉

指定该参数相当于启用了--lock-all-tables,除非同时指定--single-transaction

--include-master-host-port 通常与--dump-slave参数组合使用,将会在输出中明确master和端口

--master-data 备份master,参数取值同--dump-slave

-x --lock-all-tables 导出执行期间,全库锁表,无法读写;指定了该参数则等同于禁用--single-transaction和--lock-tables

-K --disable-keys insert语句前禁用索引,数据查完后再启用,加快插入速度,默认启用

--max-allowed-packet

--net-buffer-length

--no-autocommit

-n --no-create-db 不生成建库脚本

-R --routines 导出存储过程、函数等定义好的mysql程序

--flush-privileges 导出库后执行一次权限刷新

--igore-table 不导出的表,格式:db.table 一个参数后跟一个值

-c --complete-insert 使用包括列名的完整insert语句;适用于不同库或表对象列顺序不一致情况下的数据迁移

-C --compress 压缩客户端与服务端传输的信息

 

自动化备份脚本(摘抄自三思的涂抹mysql)

全库备份

source /data/mysqldata/scripts/mysql_env.ini

MYSQL_USER=abcd

MYSQL_PASS=1234

DATA_PATH=/data/mysqldata/backup/mysql_full

DATA_FILE=${DATA_PATH}/dbfullbak_`date +%F`.sql.gz

LOG_FILE=${DATA_PATH}/dbfullbak_`date +%F`.log

MYSQL_PATH=/usr/local/mysql/bin

MYSQL_DUMP="${MYSQL_PATH}/mysqldump -u${MYSQL_USER} -p${MYSQL_PASS} -S /xxxxx/mysql.sock -A -R -x --default-character-set=utf8"

#此处最好将-x 替换为--single-transaction -l,这样对innodb不影响备份时的读写,对myisam也只锁定当前备份的表,影响较小

 

echo >$LOG_FILE

echo -e "========Jobs started at `date +%F' '%T' '%w`========\n" >> $LOG_FILE

echo -e "**** Executed command:${MYSQL_DUMP} | gzip > $DATA_FILE ****" >> $LOG_FILE

${MYSQL_DUMP} | gzip > $DATA_FILE

echo -e "**** Jobs finished at `date +%F' '%T' '%w`****\n" >> $LOG_FILE

echo -e "**** Backup file size: `du -sh ${DATA_FILE}`****\n" >> $LOG_FILE

 

echo -e "========Find and delete expired backup files ========\n" >> $LOG_FILE

for tfile in $(/usr/bin/find $DATA_PATH/ -mtime +6)

do

if [ -d $tfile ];then

rmdir $tfile

elif [ -f $tfile ];then

rm -f $tfile

fi

echo -e "-----Delete fiel: $tfile-----" >>$LOG_FILE

done

 

echo -e "\n===== Jobs ended at `date +%F' '%T' '%w`======\n" >>$LOG_FILE

 

全库分表备份

source /data/mysqldata/scripts/mysql_env.ini

MYSQL_USER=abcd

MYSQL_PASS=1234

DATA_PATH=/data/mysqldata/backup/mysql_full_bytables

##DATA_FILE=${DATA_PATH}/dbfullbak_bytables_`date +%F`.sql.gz 本脚本未用到

LOG_FILE=${DATA_PATH}/dbfullbak_bytables_`date +%F`.log

MYSQL_PATH=/usr/local/mysql/bin

MYSQL_CMD="${MYSQL_PATH}/mysql -u${MYSQL_USER} -p${MYSQL_PASS} -S /xxxxx/mysql.sock "

MYSQL_DUMP="${MYSQL_PATH}/mysqldump -u${MYSQL_USER} -p${MYSQL_PASS} -S /xxxxx/mysql.sock --single-transaction -l "

 

echo >$LOG_FILE

echo -e "========Jobs started at `date +%F' '%T' '%w`========\n" >> $LOG_FILE

for dbs in `${MYSQL_CMD} -e "show databases" |sed '1d' |egrep -v "information_schema|mysql|performance_schema"`

do

mkdir -p ${DATA_PATH}/${dbs}

echo -e "****Database:${dbs} backup start_time:`date +%F' '%T' '%w`****" >> $LOG_FILE

for tbls in `${MYSQL_CMD} -D ${dbs} -e "show tables" |sed '1d'`

do

echo -e "****Begin ${dbs}.${tbls} dump! start_time:`date +%F' '%T' '%w`****" >> $LOG_FILE

echo -e "**** Executed command:${MYSQL_DUMP} --tables ${dbs} ${tbls} | gzip > ${DATA_PATH}/${dbs}/${tbls}.sql.gz ****" >> $LOG_FILE

${MYSQL_DUMP} --tables ${dbs} ${tbls} | gzip > ${DATA_PATH}/${dbs}/${tbls}.sql.gz

echo -e "****End ${dbs}.${tbls} dump! stop_time:`date +%F' '%T' '%w`****" >> $LOG_FILE

done

echo -e "****Database:${dbs} backup stop_time:`date +%F' '%T' '%w`****" >> $LOG_FILE

echo -e "**** Backup file size: `du -sh ${DATA_PATH}/${dbs}`****\n" >> $LOG_FILE

done

 

echo -e "========Find and delete expired backup files ========\n" >> $LOG_FILE

for tfile in $(/usr/bin/find $DATA_PATH/ -mtime +6)

do

if [ -d $tfile ];then

rmdir $tfile

elif [ -f $tfile ];then

rm -f $tfile

fi

echo -e "-----Delete fiel: $tfile-----" >>$LOG_FILE

done

 

echo -e "\n===== Jobs ended at `date +%F' '%T' '%w`======\n" >>$LOG_FILE

你可能感兴趣的:(mysql,linux,shell)