MySQL 的物理备份、逻辑备份、增量备份

  

物理备份 ,

        冷备 cp 、tar 

    首先需要两台PC: mysql   121.40.25.207 
                                   mysql02   47.98.104.114
                               (  mysql 主机有mysql服务,且已有库表等数据,mysql02 为全新的主机。)
    1、mysql主机操作步骤:
        查看数据库目录:
            ls /var/lib/mysql
        拷贝数据库目录:
            cp -r /var/lib/mysql  /root/mysql.bak
        查看备份的数据库目录:
            ls /root/mysql.bak
        压缩数据库目录进行备份:
            tar -zcf /root/mysql.tar.gz /var/lib/mysql/*
        查看备份的数据库目录压缩包:    
            ls /root
        将主机1 的数据库目录传至主机2上:     
            scp -r /root/mysql.bak [email protected]:/opt/
            
    2、mysql02主机操作步骤:
        查看MySQL数据库端口是否启动:
            netstat -lntup | grep 3306
        如果在运行中,需先暂停数据库服务:
            systemctl stop mysqld
        删除数据库服务:
            rm -rf /var/lib/mysql
        将SCP过来的数据拷贝至/var/lib/mysql路径下:
            cp -r /opt/mysql.bak/ /var/lib/mysql
        查看拷贝后的目录:
            ls -l /var/lib/mysql
        更改属主属组,将root改为mysql:
            chown -R mysql:mysql /var/lib/mysql
        再次查看,主要确认更改后的属主属组是否正确:
            ls -l /var/lib/mysql
        查看MySQL数据库端口是否启动:(此时应该已启动)
            netstat -lntup | grep 3306
        登录数据库:

           mysql -uroot -p

(此时加载的是主机mysql拷贝过来的授权库,则主机mysql管理员信息就记录在主机mysql的数据库中mysql库中的user表里, 所以此时密码应该输入的是主机mysql管理员的密码进行登录)
        
        查看数据库所有库,发现与主机mysql的数据是一致的:
            show databases;

         热备 Xtrabackup

        使用这个工具可以实现物理全备及 增量备份.

逻辑备份 mysqldump 

  中小企业全量备份策略的首选,备份策略一般是每日进行全量备份,备份会选择在流量低谷时执行,备份时可以选择锁表或者采用事务方式备份。

    使用软件自带的备份程序(备份命令)对数据做备份,在执行备份命令时,会根据已有的数据生成对应的命令,把命令存放到指定的备份文件里。恢复时,执行备份文件里的命令恢复数据。
    数据备份策略:
        完全备份 : 备份所有数据
        增量备份 : 备份上次备份后,所有新产生的数据
        差异备份 : 备份完全备份后,所有新产生的数据

    
    1、全量备份:


        备份的格式:mysqldump  -uroot -p 密码 库名 > 目录/xxx.sql
            备份单个库:
                数据库名
            备份所有库:
                -all-databases 或 -a 
            备份单张表:
                数据库名 表名
            备份多个库:
                -b 数据库1 数据库2 
            
        恢复的格式: mysql -uroot -p 密码 库名 < 目录/xxx.sql
    
            
            例如:
            首先建立一个目录用来存放备份数据:
                mkdir /mybak
            其次,进行复制:
                mysqldump -uroot -p'admin@123' -A >/mybak/alldb.sql
                mysqldump -uroot -p'admin@123' l1 >/mybak/l1.sql
                mysqldump -uroot -p'admin@123' l1 t2 >/mybak/l1_t2.sql
                mysqldump -uroot -p'admin@123' -B l1 l2 >/mybak/twodb.sql
            测试,删除数据库中的库表数据:
                drop database l1;
                drop  database l2;
            最后进行数据恢复:
                mysql -uroot -p'admin@123' l1                 mysql -uroot -p'admin@123' l2             恢复多个库时不需要提前创建相对应的库,备份文件中有建立库表的sql语句。
                mysql -uroot -p'admin@123'


    
   2、 增量备份 binlog


        使用binlog日志实现数据的增量备份与恢复
        
        binlog日志:
            也叫二进制日志,是mysql服务日志的一种,默认是没有开启的。
            用于记录除查询之外的所有SQL命令
            也可以用来数据备份与恢复
            配置mysql主从同步的必要条件
        启用binlog日志
                vim /etc/my.cnf
                    [mysqld]
                    server_id=207
                    log_bin    #默认在 /var/lib/mysql,默认命名主机名-bin。随机六位数

                systemctl restart mysqld
                #查看日志
                mysql> show master status;
                ls /var/lib/mysql
            
                #创建自定义目录,这个目录需要提前建立好,并且mysql用户要对这个文件有写入权限
                mkdir /mylog
                #修改配置:
                vim /etc/my.cnf
                    [mysqld]
                    server_id=207  
                    log_bin=/mylog/ly

                chown mysql /mylog
                systemctl restart mysqld
                #查看日志
                mysql> show master status;  #查看日志名称是否发生变化
                 日志名称发生了变化:之前:mysql-bin.000001 
                                     之后:ly.000001 
                
        每次重启服务,都会产生一个新的二进制文件。
               刷新日志: flush logs;
               查看日志:ls /mylog

               
        删除已有的binlog日志:
            清理日志:
                删除指定编号之前的binlog日志文件
                  格式:purge master logs to “binlog文件名”; 
                     purge master logs to "ly.000001";
                删除所有的binlog日志,重建新日志
                     reset master;
                此时,就会重头开始统计:
                        show master logs;
        查看binlog日志的内容:    
                mysql> show master status;
                +-----------+----------+--------------+------------------+-------------------+
                | File      | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
                +-----------+----------+--------------+------------------+-------------------+
                | ly.000001 |      154 |              |                  |                   |
                +-----------+----------+--------------+------------------+-------------------+
                1 row in set (0.00 sec)
            添加数据:
                insert into l1.t1 values("jim",26,"B180605","[email protected]");
                insert into l1.t1 values("xiaoming",27,"B180606","[email protected]");
                insert into l1.t1 values("xiaobai",23,"B180607","[email protected]");
            再次查看binlog日志内容,发现偏移量发生改变。
                mysql> show master status;
                +-----------+----------+--------------+------------------+-------------------+
                | File      | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
                +-----------+----------+--------------+------------------+-------------------+
                | ly.000001 |     1012 |              |                  |                   |
                +-----------+----------+--------------+------------------+-------------------+
                1 row in set (0.00 sec)
            查看binlog文件内容:
                # mysqlbinlog /mylog/ly.000001

        使用binlog日志恢复数据:
            命令格式:
                mysqlbinlog /路径/日志文件 | mysql -uroot -p'admin@123'
        使用binlog日志恢复指定数据:
            格式:
                通过修改日志格式类型,可以看到sql语句,来决定那些需要备份,哪些不需要备份。
            日志格式类型:
                statement 报表模式
                row 行模式
                mixed 混合模式
            查看行模式:mysql> show variables like "binlog_format";
                        +---------------+-------+
                        | Variable_name | Value |
                        +---------------+-------+
                        | binlog_format | ROW   |
                        +---------------+-------+
                        1 row in set (0.01 sec)
            修改日志记录格式:
                vim /etc/my.cnf
                    [mysqld]
                    添加:
                    binlog_format=“mixed"
                systemctl restart mysqld
                清空日志:
                     reset master
                登录数据库,查看binlog,插入数据,在日志文件中能看到刚写入的数据:
                    mysql> show master status;
                        +-----------+----------+--------------+------------------+-------------------+
                        | File      | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
                        +-----------+----------+--------------+------------------+-------------------+
                        | ly.000001 |      154 |              |                  |                   |
                        +-----------+----------+--------------+------------------+-------------------+
                        1 row in set (0.00 sec)

                    mysql> insert into l1.t1 values("luo",28,"B180608","[email protected]");
                        Query OK, 1 row affected (0.01 sec)

                    mysql> show master status;
                        +-----------+----------+--------------+------------------+-------------------+
                        | File      | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
                        +-----------+----------+--------------+------------------+-------------------+
                        | ly.000001 |      454 |              |                  |                   |
                        +-----------+----------+--------------+------------------+-------------------+
                        1 row in set (0.00 sec)

                    mysql> system mysqlbinlog /mylog/ly.000001 | grep -i insert
                    insert into l1.t1 values("luo",28,"B180608","[email protected]")

            日志文件通过 偏移量、时间点 区分记录的多条命令
                格式: 
                    mysqlbinlog 选项 /路径/日志文件 | mysql -uroot -p 密码
                    
                指定偏移量:
                    –start-position=偏移量开始值 --stop-position=偏移量结束值
                指定时间点:
                    –start-datetime=“yyyy-mm-dd hh:mm:ss” --stop-datetime=“yyyy-mm-dd hh:mm:ss”
                
                例如:
                删除刚才添加的那条数据:
                mysql> delete from l1.t1 where name="luo";
                Query OK, 1 row affected (0.01 sec)
                
                查看命令是否写入成功:
                # mysqlbinlog /mylog/ly.000001 | grep -i delete
                delete from l1.t1 where name="luo"
                
                日志文件传输,mysql主机拷贝至mysql02主机上:
                # scp /mylog/ly.000001 [email protected]:/tmp
                [email protected]'s password:
                ly.000001                                                            100%  729    96.2KB/s   00:00
                
                在mysql02主机上查看:
                [root@mysql02 ~]# mysqlbinlog /tmp/ly.000001
                 展示执行sql的binlog信息,截取如下:
            
                # at 454
                #221027 18:17:33 server id 207  end_log_pos 519 CRC32 0x32cd22b1        GTID [commit=yes]
                SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
                # at 519
                #221027 18:17:33 server id 207  end_log_pos 594 CRC32 0x10f9b1f4        Query   thread_id=3     exec_time=0    error_code=0
                SET TIMESTAMP=1666865853/*!*/;
                BEGIN
                /*!*/;
                # at 594
                #221027 18:17:33 server id 207  end_log_pos 698 CRC32 0x205df697        Query   thread_id=3     exec_time=0    error_code=0
                SET TIMESTAMP=1666865853/*!*/;
                delete from l1.t1 where name="luo"
                /*!*/;
                # at 698
                #221027 18:17:33 server id 207  end_log_pos 729 CRC32 0x576de941        Xid = 29
                COMMIT/*!*/;
                DELIMITER ;
                # End of log file
                ROLLBACK /* added by mysqlbinlog */;
                /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
                /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
            
            上述注释:# at 519  为开始偏移量
                      #221027  为系统时间
                      # at 698  为语句偏移量698
                      COMMIT  为提交 

                    这里我们使用的是开始偏移量和语句提交后的偏移量(提交后语句才会生效)
    

总结:

物理备份与逻辑备份的区别:

MySQL 的物理备份、逻辑备份、增量备份_第1张图片 

 

你可能感兴趣的:(MySQL,mysql,数据库)