美文网首页
Linux 备份Mysql数据库

Linux 备份Mysql数据库

作者: taogan | 来源:发表于2021-12-09 15:44 被阅读0次

首先创建专门用于备份数据的用户,并设置权限

sh >  mysql -uroot -p -e 
"GRANT SELECT,RELOAD,LOCK TABLES,REPLICATION CLIENT,SHOW VIEW,EVENT,TRIGGER,PROCESS ON *.* TO 
'usre'@'localhost' identified BY 'password'"

第一种方案

#!/bin/bash
#program:全备份数据库
#author:gt
#date:2021/12/08
#version:1.0
#history:

#备份目录
backup_dir=/backup/mysql
test ! -d $backup_dir && mkdir -p $backup_dir
backup_name_prefix=full_backup
backup_name=${backup_name_prefix}$(date +'%Y%m%d')

#需要备份的数据库,自行修改需要备份的数据库,也可以做成接受参数的形式
database='sql_inform slow_query_log' 

#错误日志
log_dir=/var/log/mysql
test ! -d $log_dir && mkdir -p $log_dir
backup_err_log=$log_dir/mysql_backup_err.log

echo "===============================================$(date +'%Y-%m-%d %H:%M:%S')===============================================" > $backup_err_log

if [ -n "$database" ] ;then
    
    database_list=$(echo "$database" | awk 'BEGIN{RS=" "}{print $1}')
   
    #查询条件拼接,格式: 'a', 'b' 
    cond=''
    db_size=0
    for name in $database_list
    do
    if [ -z "$cond" ];then
        cond=$(echo "'$name'")
    else    
            cond=$(echo "$cond,'$name'")
    fi
    db_size=$(($db_size+1))
    done
 
    #生成临时表名文件
    tmp_table=/tmp/tables.txt
    sql="select table_schema, table_name from information_schema.tables where table_schema in ($cond)"
    #根据数据库名查询表名,并输出到临时文件
    /bin/mysql -ubackup -e "$sql" -s > $tmp_table 2>> $backup_err_log
    
    if [ ! -f $tmp_table ] || [ -z "$(cat $tmp_table)" ];then
        echo "查询备份数据库的表为空, sql: $sql" >> $backup_err_log
        exit 1;
    fi

    #生成数据库备份目录和表备份文件
    rm_db_dir=''
    success_db=''
    err_db=''
    err_num=0
    db_null=0
    for db in $database_list
    do
    #创建目录
    test ! -d $backup_dir/$db && mkdir -p $backup_dir/$db
    
    rm_db_dir=$(echo "$rm_db_dir $db")
        
    tables_list=$(cat $tmp_table | awk -v db="$db" '$1 == db{print $2}')
       
    if [ -n "$tables_list" ];then
        for table in $tables_list
        do
           #创建表sql文件
           /bin/mysqldump -ubackup -c --single-transaction $db $table > $backup_dir/$db/$table.sql 2>> $backup_err_log
        done
        success_db=$(echo "$success_db $db")
    else
        echo "数据库[ $db ]表为空" >> $backup_err_log
        err_db=$(echo "$err_db $db")
        err_num=$(($err_num+1))
        db_null=1
        fi
        # 导出函数
        test 0 -eq $db_null && /bin/mysqldump -ubackup -n -t -d -R $db > $backup_dir/$db/function.sql || db_null=0
    done
   
    if [ $db_size -eq $err_num ];then
    echo -e "导出数据库[ $err_db ]全部失败, 数据库表内容如下:\n$(cat $tmp_table)" >> $backup_err_log
        rm -fr $err_db
    rm -f $tmp_table
    exit 1
    elif [ $err_num -gt 0 ];then
    echo -e "导出数据库[ $err_db ]失败, 数据库表内容如下:\n$(cat $tmp_table)" >> $backup_err_log
    fi
  
    cd $backup_dir
  
    tar -zvc -f $backup_name.tar.gz $success_db > /dev/null 2>> $backup_err_log 
    
    #删除临时文件
    rm -rf $rm_db_dir
    rm -f $tmp_table
    
    find $backup_dir -mtime +6 -name "$backup_name_prefix*.tar.gz" -type f -exec rm -f {} \; 2>> $backup_err_log 
    echo "备份数据库[ $success_db ]完成" >> $backup_err_log
    exit 0
else
    echo "没有需要备份的数据库" >> $backup_err_log
    exit 1
fi

备份后的效果如下:分库分表备份,在数据量大的情况下, 方便查看和灵活恢复单表数据,缺点是执行速度相对第二种方案较慢,函数和存储过程备份文件为 function.sql


image.png

第二种方案

#!/bin/bash
#program:全备份数据库
#author:gt
#date:2021/12/08
#version:1.0
#history:

#备份目录
backup_dir=/backup/mysql
test ! -d $backup_dir && mkdir -p $backup_dir
backup_name_prefix=full_backup
backup_name=$backup_name_prefix$(date +'%Y%m%d')

#需要备份的数据库
database='sql_inform slow_query_log' 

#错误日志
log_dir=/var/log/mysql
test ! -d $log_dir && mkdir -p $log_dir
backup_err_log=$log_dir/mysql_backup_err.log

echo "===============================================$(date +'%Y-%m-%d %H:%M:%S')===============================================" > $backup_err_log

if [ -n "$database" ] ;then
    db_files=''
    database_list=$(echo "$database" | awk 'BEGIN{RS=" "}{print $1}')
    for db in $database_list
    do
        #备份数据,并生成新的二进制文件
        /bin/mysqldump -ubackup --no-create-db -c -R --single-transaction --databases $db -F > $backup_dir/$db.sql 2>> $backup_err_log
    #删除 use tale 自动切换数据库语法,避免误切换,导致覆盖已有的数据
    sed -i 's/USE.*\;//g' $backup_dir/$db.sql 2>> $backup_err_log
    db_files=$(echo "$db_files $db.sql")
    done
    
    cd $backup_dir
    #压缩备份文件
    tar -zvc -f $backup_name.tar.gz $db_files  > /dev/null 2>> $backup_err_log

    #删除源备份文件
    rm -f $db_files 2>> $backup_err_log

    #删除7天以前的备份数据
    find $backup_dir -mtime +6 -name "$backup_name_prefix*.tar.gz" -type f -exec rm -f {} \; 2>> $backup_err_log

    echo "备份数据库[ $database ] 成功" >> $backup_err_log
else
    echo "无备份数据库" >> $backup_err_log
fi

备份效果,每个数据库单独一个sql文件,里面包含表结构,表数据,视图,函数和存储过程,缺点就是当数据量大的时候,查阅比较麻烦


image.png

相关文章

网友评论

      本文标题:Linux 备份Mysql数据库

      本文链接:https://www.haomeiwen.com/subject/dzyffrtx.html