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

Linux 备份Mysql数据库

作者: Js_Gavin | 来源:发表于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