美文网首页
Mysql安装与通过xtrabackup备份

Mysql安装与通过xtrabackup备份

作者: XJ2017 | 来源:发表于2019-12-23 16:25 被阅读0次

    1、Mysql安装

    • 下载并安装
        #下载安装包
        wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-server_5.7.26-1ubuntu18.04_amd64.deb-bundle.tar
    
        #安装MySQL
        sudo dpkg -i mysql-common_5.7.26-1ubuntu18.04_amd64.deb 
        sudo dpkg-preconfigure mysql-community-server_5.7.26-1ubuntu18.04_amd64.deb 
        sudo dpkg -i libmysqlclient20_5.7.26-1ubuntu18.04_amd64.deb 
        sudo dpkg -i libmysqlclient-dev_5.7.26-1ubuntu18.04_amd64.deb 
        sudo dpkg -i mysql-community-client_5.7.26-1ubuntu18.04_amd64.deb 
        sudo dpkg -i mysql-client_5.7.26-1ubuntu18.04_amd64.deb 
        sudo apt update
        sudo apt install libmecab2 
        sudo dpkg -i mysql-community-server_5.7.26-1ubuntu18.04_amd64.deb 
        sudo dpkg -i mysql-server_5.7.26-1ubuntu18.04_amd64.deb
    
    • 修改默认配置
    设置sudo免密码
            设置当前用户sudo免密码
            cd /etc/sudoers.d
            touch nopwd4sudo
            vi nopwd4sudo 
            用户名 ALL=(ALL) NOPASSWD : ALL
    
    sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
        
            [mysqld]        
            bind-address    = 0.0.0.0
            
            # 服务端使用的字符集默认为8比特编码的latin1字符集
            character-set-client-handshake=FALSE
            character-set-server=utf8mb4
            collation-server=utf8mb4_unicode_ci
            init_connect='SET NAMES utf8mb4'
            # sql_mode的方式强制指定不需要ONLY_FULL_GROUP_BY属性
            sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
            
            #设置不区分大小写
            lower_case_table_names=1
    
            [mysql]
            # 设置mysql客户端默认字符集
            default-character-set = utf8mb4
    
            [client]
            default-character-set = utf8mb4
    
    • Mysql简单运维命令
        # 进入MySQL: 
        mysql -u root -p
        # 启动: 
        sudo service mysql start
        # 重启:
        sudo  service mysql restart 
        # 关闭: 
        sudo service mysql stop
        # 检查mysql是否在运行:  
        sudo service mysql status
    
    • Mysql默认相关目录
        # 数据库目录
        /var/lib/mysql/
        # 配置文件
        /usr/share/mysql(mysql.server命令及配置文件)
        # 相关命令
        /usr/bin(mysqladmin mysqldump等命令)
        # 启动脚本
        /etc/init.d/(启动脚本文件mysql的目录)
    

    2、分配用户权限

    • 创建数据库、用户并设置权限
        # 创建数据库
        create database ***;
    
        # 新建用户并授权(https://www.cnblogs.com/sos-blue/p/6852945.html)
        CREATE USER 'username'@'host' IDENTIFIED BY 'password';
        GRANT all privileges ON databasename.tablename TO 'username'@'host'
        
        # 新增具体权限
        # grant 普通数据用户,查询、插入、更新、删除 数据库中所有表数据的权利。
            grant select on testdb.* to common_user@'%'
            grant insert on testdb.* to common_user@'%'
            grant update on testdb.* to common_user@'%'
            grant delete on testdb.* to common_user@'%'
        # 或者,用一条 MySQL 命令来替代:
            grant create, alter, drop, select, insert, update, delete on testdb.* to common_user@'%'
    

    3、数据备份

    • 安装xtrabackup
        wget https://www.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.15/binary/debian/bionic/x86_64/percona-xtrabackup-24_2.4.15-1.bionic_amd64.deb
        sudo dpkg -i percona-xtrabackup-24_2.4.15-1.bionic_amd64.deb
        # 出现依赖问题:(https://blog.csdn.net/ROVAST/article/details/51817274)
            sudo apt-get update # 更新
            sudo apt-get -f install # 解决依赖关系
            sudo dpkg -i xxx.deb # 重新安装
    
    • 新增xtrabackup备份用户
        # mysql授权(https://www.percona.com/doc/percona-xtrabackup/2.4/using_xtrabackup/privileges.html)
        CREATE USER 'backup'@'localhost' IDENTIFIED BY '...';
        GRANT PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'backup'@'localhost';
        FLUSH PRIVILEGES;
    
    #!/bin/sh
    #percona-xtrabackup全量和增量备份脚本
    #Author :Will
    #WebSite : www.52os.net
    #date : 2015/10/21
    #usage: 1. full backup  : ./backup.sh full
    #       2. incremental backup : ./backup.sh inc
    Innobackupex_Path=/usr/bin/innobackupex
    Mysql_Client=/usr/bin/mysql
    Bak_Time=`date +%Y%m%d_%H%M%S`
    #请勿在Incrbackup_Path及下属文件夹创建或写入内容,否则可能导致增量备份不成功
    #Backup_Dir=/opt/backup   #备份主目录
        #Backup_Dir=/opt/backup/data/`date -I`   #按日期生成备份主目录
    Backup_Dir=/home/mysql/backup/data
    Fullbackup_Path=$Backup_Dir/full/`date -I` # 全库备份的目录  
    Incrbackup_Path=$Backup_Dir/incr/`date -I`/`date +%H` # 增量备份的目录  
    Log_Path=$Backup_Dir/logs   #日志文件目录
    Keep_Incbackup=3    #保留的增量备份天数,此处要加e1; 如要保留2个,此处要写3 
    Keep_Fullbackup=8    #保留的全备份天数,此处要加1; 如要保留2个,此处要写3 
    #Mysql_Conf=/etc/my.cnf #mysql配置文件
    Mysql_Conf=/etc/mysql/mysql.conf.d/mysqld.cnf
    Mysql_Opts='--host=localhost --user=backup --password=ddblock!@#$backup'  #mysql的连接配置,按需修改
    
    Error()
      {  
        echo -e "\e[1;31m$1\e[0m" 1>&2
        exit 1  
      }  
    
    Backup()
      {
        #两个参数为全量备份,第一个参数为备份目录,第二个参数为日志全路径
        if [ $# = 2 ] ; then
            $Innobackupex_Path --defaults-file=$Mysql_Conf $Mysql_Opts  --no-timestamp  $1/full_$Bak_Time>$2 2>&1
        #三个参数为增量备份,第一个为增量备份目录,第二个为上个增量备份目录,第三个为日志全路径 
        elif [ $# = 3 ];then
            $Innobackupex_Path --defaults-file=$Mysql_Conf $Mysql_Opts  --no-timestamp --incremental  $1/incr_$Bak_Time  --incremental-basedir $2 >$3 2>&1
        else
        Error "Backup(): 参数不正确"
         fi 
      }
    
    
    #获得某个目录下,最近修改的目录
    Lastest_Dir()
      {
        if [ -d $1 ]; then
            path=`ls -t $1 |head -n 1`
            if [  $path ]; then
                echo $path
            else
                Error "Lastest_Diri(): 目录为空,没有最新目录"
            fi
        else
            Error "Latest_Dir(): 目录不存在或者不是目录"
        fi
      }
    
     
    #进行增量备份
    Do_Inc()
      {
        if [ "$(ls -A $Incrbackup_Path)" ] ; then
            #不是第一次增量备份,以最新的增量备份目录为base_dir
            Backup $Incrbackup_Path $Incrbackup_Path/`Lastest_Dir $Incrbackup_Path`  $Log_Path/incr_$Bak_Time.log 
          else
            #第一次增量备份要先全量备份
            Backup $Incrbackup_Path  $Log_Path/incr_full_$Bak_Time.log 
        fi
        #保存最新*天的备份
        cd $Incrbackup_Path/../../
        ls -t |tail -n +$Keep_Incbackup |xargs  rm -rf
      }
    
    #进行全量备份
    Do_Full()
      {
        Backup     $Fullbackup_Path $Log_Path/full_$Bak_Time.log
        cd $Fullbackup_Path/../
        ls -t |tail -n +$Keep_Fullbackup |xargs  rm -rf 
        
      }
    
    #环境和配置检查
    Check()
      {
        #检查目录和创建目录
        if [ ! -d $Fullbackup_Path ];then
            mkdir -p $Fullbackup_Path
        fi
    
        if [ ! -d $Incrbackup_Path ];then
            mkdir -p $Incrbackup_Path
        fi
    
        if [ ! -d $Log_Path ];then
            mkdir -p $Log_Path
        fi
    
        #检测所需的软件
        if [ ! -f $Innobackupex_Path ];then
            Error "未安装xtradbbackup或xtradbbackup路径不正确"
        fi
    
        if [ ! -f $Mysql_Client ];then
            Error "未安装mysql客户端"
        fi
        
        if [ ! -f $Mysql_Conf ];then
            Error "mysql配置文件路径不正确"
        fi
    
        #检查mysql的运行状态
        if [ `netstat -tlnp |grep mysqld |wc -l` = 0 ];then
            Error "MySQL没有运行"
        fi
    
        #验证mysql的用户和密码是否正确
        if  ! `echo 'exit' | $Mysql_Client -s  $Mysql_Opts >/dev/null 2>&1` ; then
            Error "提供的数据库连接配置不正确!"  
        fi
      }
    
    case $1 in
    
           full)
              Check
              Do_Full
              ;;
    
            inc)
              Check
              Do_Inc
              ;;
    
             *)
              echo "full 全量备份"
          echo "inc  增量备份"
          ;;
    esac 
    
    
    • 加入linux的定时任务执行备份
        # 查看定时服务(使用service cron status看不到脚本执行情况)
        sudo service cron status
        # 启动服务:
        service cron start 
        # 关闭服务:
        service cron stop
        # 重启服务:
        service cron restart 
        # 重新载入配置:
        service cron reload
        
        # 编辑cron:crontab -e(编辑完后重新载入配置),
        # 注意:backup.sh是指上述脚本
            0 0 * * * /home/mysql/backup/backup.sh full
            */5 * * * * /home/mysql/backup/backup.sh inc
    
    • 远程同步备份数据
    // TODO 待完善
    

    4、恢复备份数据

        # 注意:恢复后一定得重启数据库,否则部分事务未体现。最好事先停止数据库
        
            摘抄自(https://www.cnblogs.com/nmap/p/6722400.html)
            1、 备份恢复思路
            将增量备份1、增量备份2…合并到完整备份,加到一起出来一个新的完整备份,将新的完整备份以拷贝的形式到数据库空目录(rm /var/lib/mysql/* -rf)
             
            2、预备完整备份
            xtrabackup把备份过程中可能有尚未提交的事务或已经提交但未同步数据文件的事务,写到xtrabackup_logfile文件,所以要先通过这个日志文件回滚,把未完成的事务同步到备份文件,保证数据文件处于一致性。 
            # innobackup --apply-log --redo-only 2015-02-08_11-56-48
            2.1、合并第一个增量备份
            # innobackupex --apply-log --redo-only /mysql_backup/2015-02-08_11-56-48/ --incremental-dir=mysql_backup/2015-02-08_12-16-06
            2.2、 合并第二个增量备份
            # innobackupex --apply-log --redo-only /mysql_backup/2015-02-08_11-56-48/ --incremental-dir=mysql_backup/2015-02-08_16-06-53
    
            3、恢复完整备份(先清空/var/lib/mysql)
            这时2015-02-08_11-56-48完整备份已经包含所有增量备份,可以通过查看checkpoints来核实         
            # innobackupex --defaults-file=/etc/mysql/mysql.conf.d/mysqld.cnf --copy-back /mysql_backup/2015-02-08_11-56-48/
            4、修改恢复数据文件权限
            # chown -R mysql.mysql /var/lib/mysql
            5、启动MySQL,查看数据库恢复情况
            # /etc/init.d/mysqld start
    

    相关文章

      网友评论

          本文标题:Mysql安装与通过xtrabackup备份

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