• mysql 逻辑备份 恢复数据


    一、逻辑备份

    逻辑备份:备份的是建表,建库,插入数据等操作所执行SQL语句,适用于中小型数据库,效率相对较低,提供三种级别的备份,表级,库级和全库级。

    本质:导出的是SQL语句

    优点:不论是什么存储引擎,都可以用mysqldump备份成SQL语句

    缺点:速度较慢,导出时可能会出现格式不兼容的突发状况,无法做增量备份和累计增量备份

    数据一致,服务可用:如何保证数据一致,在备份的时候进行锁表会自动锁表。锁住之后在备份。

    二、逻辑备份:

    1、备份全部数据库

    语法:mysqldump -u指定用户 -p指定密码 -A > 文件名

               mysqldump -u指定用户 -p指定密码 --all-databases > 文件名

    1. [root@localhost ~]# mysqldump -uroot -p123 -A > all.mysql
    2. mysqldump: [Warning] Using a password on the command line interface can be insecure.
    3. [root@localhost ~]# mysqldump -uroot -p123 --all-database >all1.txt
    4. mysqldump: [Warning] Using a password on the command line interface can be insecure.

    2.备份部分数据库

    语法:mysqldump -u指定用户 -p密码 -B  数据库名1 数据库名2> 文件名

               mysqldump -u指定用户 -p密码 --databases 数据库名1 数据库名2 > 文件名

    1. [root@localhost ~]# mysqldump -uroot -p123 -B db1 >db1.txt
    2. mysqldump: [Warning] Using a password on the command line interface can be insecure.
    3. [root@localhost ~]# mysqldump -uroot -p123 --databases db1 school > db2.txt
    4. mysqldump: [Warning] Using a password on the command line interface can be insecure.

    3.备份表

    语法:mysqldump -u指定用户 -p指定密码 数据库名 表名 > 文件名

    1. [root@localhost ~]# mysqldump -uroot -p123 db1 employee > employee.txt
    2. mysqldump: [Warning] Using a password on the command line interface can be insecure.

    4.备份表结构

    语法:mysqldump -u指定用户 -p指定密码 -d 数据库名 表名 

    1. [root@localhost ~]# mysqldump -uroot -p123 -d db1 employee > jiegou.txt
    2. mysqldump: [Warning] Using a password on the command line interface can be insecure.

    5.备份表数据

    语法:select * from  表.库 into outfile'/var/lib/mysql-files/文件名';

    1. mysql> show variables like 'secure%'; #查看默认导出路径
    2. +------------------+-----------------------+
    3. | Variable_name | Value |
    4. +------------------+-----------------------+
    5. | secure_auth | ON |
    6. | secure_file_priv | /var/lib/mysql-files/ |
    7. +------------------+-----------------------+
    8. 2 rows in set (0.00 sec)
    9. mysql> select * from mysql.user into outfile '/var/lib/mysql-files/b.xfs';
    10. Query OK, 6 rows affected (0.00 sec)

    扩展:修改默认的导出路径

    1. [root@localhost opt]# mkdir backup #创建默认目录
    2. [root@localhost opt]# chown -R mysql.mysql /opt/backup#修改目录的属主和属组
    3. [root@localhost opt]# vim /etc/my.cnf #修改配置文件
    4. secure_file_priv=/opt/backup
    5. [root@localhost opt]# systemctl restart mysqld #重启mysql
    6. [root@localhost opt]# mysql -p123 #进入mysql
    7. Welcome to the MySQL monitor. Commands end with ; or \g.
    8. Your MySQL connection id is 2
    9. Server version: 5.7.43 MySQL Community Server (GPL)
    10. Copyright (c) 2000, 2023, Oracle and/or its affiliates.
    11. Oracle is a registered trademark of Oracle Corporation and/or its
    12. affiliates. Other names may be trademarks of their respective
    13. owners.
    14. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    15. mysql> show variables like 'secure%'; #再次查看文件的默认路径
    16. +------------------+--------------+
    17. | Variable_name | Value |
    18. +------------------+--------------+
    19. | secure_auth | ON |
    20. | secure_file_priv | /opt/backup/ |
    21. +------------------+--------------+
    22. 2 rows in set (0.01 sec)

    6.恢复

    (1)命令行恢复数据库

         a)命令行恢复

    语法:mysql -u用户名 -p密码 < 之前备份的文件

    1. mysql> drop database db1; #先删除数据库db1
    2. Query OK, 15 rows affected (0.07 sec)
    3. mysql> show databases; #查看数据库
    4. +--------------------+
    5. | Database |
    6. +--------------------+
    7. | information_schema |
    8. | db3 |
    9. | mysql |
    10. | performance_schema |
    11. | school |
    12. | sys |
    13. +--------------------+
    14. 6 rows in set (0.00 sec)
    15. [root@localhost ~]# mysql -uroot -p123 < db1.txt #恢复数据库
    16. mysql: [Warning] Using a password on the command line interface can be insecure.
    17. mysql> show databases; #再次查看数据库
    18. +--------------------+
    19. | Database |
    20. +--------------------+
    21. | information_schema |
    22. | db1 |
    23. | db3 |
    24. | mysql |
    25. | performance_schema |
    26. | school |
    27. | sys |
    28. +--------------------+
    29. 7 rows in set (0.00 sec)
        b)数据库里面恢复

    语法:source +备份数据库的路径

    1. mysql> drop database db1; #删除数据库db1
    2. Query OK, 15 rows affected (0.05 sec)
    3. mysql> source /root/db1.txt #恢复数据库db1
    4. Query OK, 0 rows affected (0.00 sec)
    5. .
    6. .
    7. Query OK, 0 rows affected (0.00 sec)
    8. mysql> show databases; #查看数据库
    9. +--------------------+
    10. | Database |
    11. +--------------------+
    12. | information_schema |
    13. | db1 |
    14. | db3 |
    15. | mysql |
    16. | performance_schema |
    17. | school |
    18. | sys |
    19. +--------------------+
    20. 7 rows in set (0.00 sec)

    (2)恢复表

    a)在命令行恢复

    语法:mysql -u用户 -p密码   表所在的数据库< 备份的文件

    1. [root@localhost ~]# mysql -uroot -p123 db1< employee.txt
    2. mysql: [Warning] Using a password on the command line interface can be insecure.
    b)在数据库里面恢复

    语法:source +备份的路径

    1. mysql> source /root/employee.txt
    2. Query OK, 0 rows affected (0.00 sec)
    3. Query OK, 0 rows affected (0.00 sec)

    (3)恢复表结构

    语法:mysql -u用户 -p密码 -D 数据库名 < 备份的文件

    1. [root@localhost ~]# mysql -uroot -p123 -D db1 <jiegou.txt
    2. mysql: [Warning] Using a password on the command line interface can be insecure.
    3. mysql> desc employee;
    4. +-----------------+---------------------+------+-----+---------+----------------+
    5. | Field | Type | Null | Key | Default | Extra |
    6. +-----------------+---------------------+------+-----+---------+----------------+
    7. | id | int(11) | NO | PRI | NULL | auto_increment |
    8. | name | varchar(30) | NO | | NULL | |
    9. | sex | enum('man','woman') | YES | | man | |
    10. | hire_date | date | YES | | NULL | |
    11. | post | varchar(20) | YES | | NULL | |
    12. | job_description | varchar(100) | YES | | NULL | |
    13. | salary | double(15,2) | NO | | NULL | |
    14. | office | int(11) | YES | | NULL | |
    15. | dep_id | int(11) | YES | | NULL | |
    16. +-----------------+---------------------+------+-----+---------+----------------+
    17. 9 rows in set (0.00 sec)
    18. mysql> select * from employee;
    19. Empty set (0.00 sec)

    (4)恢复表中数据

    1. mysql> truncate employee; #清空表中数据
    2. Query OK, 0 rows affected (0.02 sec)
    3. mysql> select * from employee; #查看表中数据
    4. Empty set (0.00 sec)
    5. mysql> load data infile'/opt/backup/a.txt'into table employee;
    6. Query OK, 15 rows affected (0.01 sec)
    7. Records: 15 Deleted: 0 Skipped: 0 Warnings: 0
    8. mysql> select * from employee;
    9. +----+-----------+-------+------------+------------+-----------------+----------+--------+--------+
    10. | id | name | sex | hire_date | post | job_description | salary | office | dep_id |
    11. +----+-----------+-------+------------+------------+-----------------+----------+--------+--------+
    12. | 1 | qiancheng | man | 2018-03-14 | hr | talk | 7000.00 | 501 | 102 |
    13. | 20 | tom | man | 2017-09-15 | instructor | teach | 8000.00 | 501 | 100 |
    14. | 21 | alince | woman | 2013-04-28 | instructor | teach | 5500.00 | 501 | 100 |
    15. | 22 | robin | man | 2020-09-18 | instructor | teach | 7200.00 | 501 | 100 |
    16. | 23 | zhuzhu | man | 2016-12-09 | hr | hrcc | 6000.00 | 502 | 101 |
    17. | 24 | gougou | woman | 2015-04-27 | hr | NULL | 6000.00 | 502 | 101 |
    18. | 30 | maomao | man | 2019-08-12 | sale | talk | 20000.00 | 503 | 102 |
    19. | 31 | yiyi | man | 2015-06-17 | talk | NULL | 8000.00 | NULL | NULL |
    20. | 40 | harry | woman | 2018-02-05 | hr | hrcc | 6900.00 | 502 | 102 |
    21. | 41 | tianyuan | man | 2018-02-05 | null | salecc | 9700.00 | 501 | 102 |
    22. | 42 | xiaoyi | man | 2018-02-05 | null | salecc | 5700.00 | 501 | 102 |
    23. | 50 | zxvb | man | 2019-04-23 | hr | NULL | 8000.00 | NULL | NULL |
    24. | 51 | ab | man | NULL | NULL | NULL | 6500.00 | NULL | NULL |
    25. | 52 | cd | man | NULL | NULL | NULL | 7600.00 | NULL | NULL |
    26. | 53 | ef | man | NULL | NULL | NULL | 8900.00 | NULL | NULL |
    27. +----+-----------+-------+------------+------------+-----------------+----------+--------+--------+
    28. 15 rows in set (0.00 sec)

    三、bin-log 日志恢复数据

    1.开启binlog日志功能

    (1).修改配置文件

    1. [root@localhost ~]# vim /etc/my.cnf
    2. server-id=1 #添加server-id
    3. log-bin = /opt/log/mysql-bin.log #指定binlog日志文件的存放位置和名称,位置和名称都可以自定义

    (2).修改/opt/log属主属组

    [root@localhost ~]# chown -R mysql.mysql /opt/log

    (3).重启mysql服务,使修改的配置文件生效

    1. [root@localhost ~]# systemctl restart mysqld
    2. [root@localhost ~]# cd /opt/log
    3. [root@localhost log]# ls
    4. mysql-bin.000001 mysql-bin.index

    2.刷新binlog日志

    mysql> flush logs;				#刷新binlog日志,使下面的语句存放到下一个binlog日志中

    3.查看当前存储的binlog文件

    1. mysql> show master status;
    2. +------------------+----------+--------------+------------------+-------------------+
    3. | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
    4. +------------------+----------+--------------+------------------+-------------------+
    5. | mysql-bin.000002 | 154 | | | |
    6. +------------------+----------+--------------+------------------+-------------------+
    7. 1 row in set (0.00 sec)

    4.恢复数据

    案例:不小心删除了数据库中的一张表及其数据

    (1)进入binlog文件的目录,查看bin-log文件

    1. [root@localhost ~]# cd /opt/log
    2. [root@localhost log]# ls
    3. mysql-bin.000001 mysql-bin.000002 mysql-bin.index
    4. [root@localhost log]# mysqlbinlog mysql-bin.000002 --base64-output=decode-rows -vv
    5. /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
    6. /*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
    7. DELIMITER /*!*/;
    8. # at 4
    9. #231007 19:40:11 server id 1 end_log_pos 123 CRC32 0xa788ae39 Start: binlog v 4, server v 5.7.43-log created 231007 19:40:11
    10. # Warning: this binlog is either in use or was not closed properly.
    11. # at 123
    12. #231007 19:40:11 server id 1 end_log_pos 154 CRC32 0xd228507b Previous-GTIDs
    13. # [empty]
    14. # at 154
    15. #231007 19:45:19 server id 1 end_log_pos 219 CRC32 0xdf49c909 Anonymous_GTID last_committed=0 sequence_number=1 rbr_only=no
    16. SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
    17. # at 219
    18. #231007 19:45:19 server id 1 end_log_pos 329 CRC32 0x7f94b39e Query thread_id=3 exec_time=0 error_code=0
    19. SET TIMESTAMP=1696679119/*!*/;
    20. SET @@session.pseudo_thread_id=3/*!*/;
    21. SET @@session.foreign_key_checks=1, @@session.sql_auto_is_null=0, @@session.unique_checks=1, @@session.autocommit=1/*!*/;
    22. SET @@session.sql_mode=1436549152/*!*/;
    23. SET @@session.auto_increment_increment=1, @@session.auto_increment_offset=1/*!*/;
    24. /*!\C utf8 *//*!*/;
    25. SET @@session.character_set_client=33,@@session.collation_connection=33,@@session.collation_server=8/*!*/;
    26. SET @@session.lc_time_names=0/*!*/;
    27. SET @@session.collation_database=DEFAULT/*!*/;
    28. create database db default charset'utf8'
    29. /*!*/;
    30. # at 329
    31. #231007 19:46:20 server id 1 end_log_pos 394 CRC32 0xc79d4673 Anonymous_GTID last_committed=1 sequence_number=2 rbr_only=no
    32. SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
    33. # at 394
    34. #231007 19:46:20 server id 1 end_log_pos 513 CRC32 0xeca5dcea Query thread_id=3 exec_time=0 error_code=0
    35. use `db`/*!*/;
    36. SET TIMESTAMP=1696679180/*!*/;
    37. create table db1(id int,name varchar(30),age int)
    38. /*!*/;
    39. # at 513
    40. #231007 19:47:58 server id 1 end_log_pos 578 CRC32 0x502f26e0 Anonymous_GTID last_committed=2 sequence_number=3 rbr_only=yes
    41. /*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
    42. SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
    43. # at 578
    44. #231007 19:47:58 server id 1 end_log_pos 648 CRC32 0x1c085c1f Query thread_id=3 exec_time=0 error_code=0
    45. SET TIMESTAMP=1696679278/*!*/;
    46. BEGIN
    47. /*!*/;
    48. # at 648
    49. #231007 19:47:58 server id 1 end_log_pos 696 CRC32 0x836eb6d7 Table_map: `db`.`db1` mapped to number 109
    50. # at 696
    51. #231007 19:47:58 server id 1 end_log_pos 784 CRC32 0x9580d081 Write_rows: table id 109 flags: STMT_END_F
    52. ### INSERT INTO `db`.`db1`
    53. ### SET
    54. ### @1=1 /* INT meta=0 nullable=1 is_null=0 */
    55. ### @2='xiaoli' /* VARSTRING(90) meta=90 nullable=1 is_null=0 */
    56. ### @3=23 /* INT meta=0 nullable=1 is_null=0 */
    57. ### INSERT INTO `db`.`db1`
    58. ### SET
    59. ### @1=2 /* INT meta=0 nullable=1 is_null=0 */
    60. ### @2='xiaozhang' /* VARSTRING(90) meta=90 nullable=1 is_null=0 */
    61. ### @3=34 /* INT meta=0 nullable=1 is_null=0 */
    62. ### INSERT INTO `db`.`db1`
    63. ### SET
    64. ### @1=3 /* INT meta=0 nullable=1 is_null=0 */
    65. ### @2='zhangsan' /* VARSTRING(90) meta=90 nullable=1 is_null=0 */
    66. ### @3=42 /* INT meta=0 nullable=1 is_null=0 */
    67. # at 784
    68. #231007 19:47:58 server id 1 end_log_pos 815 CRC32 0xe927fd1d Xid = 12
    69. COMMIT/*!*/;
    70. # at 815
    71. #231007 19:48:10 server id 1 end_log_pos 880 CRC32 0xcdc9d73a Anonymous_GTID last_committed=3 sequence_number=4 rbr_only=yes
    72. /*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
    73. SET @@SESSION.GTID_NEXT= 'ANONYMOUS'/*!*/;
    74. # at 880
    75. #231007 19:48:10 server id 1 end_log_pos 950 CRC32 0x0a8ade69 Query thread_id=3 exec_time=0 error_code=0
    76. SET TIMESTAMP=1696679290/*!*/;
    77. BEGIN
    78. /*!*/;
    79. # at 950
    80. #231007 19:48:10 server id 1 end_log_pos 998 CRC32 0x68b7b908 Table_map: `db`.`db1` mapped to number 109
    81. # at 998
    82. #231007 19:48:10 server id 1 end_log_pos 1086 CRC32 0xc1c77e9d Delete_rows: table id 109 flags: STMT_END_F
    83. ### DELETE FROM `db`.`db1`
    84. ### WHERE
    85. ### @1=1 /* INT meta=0 nullable=1 is_null=0 */
    86. ### @2='xiaoli' /* VARSTRING(90) meta=90 nullable=1 is_null=0 */
    87. ### @3=23 /* INT meta=0 nullable=1 is_null=0 */
    88. ### DELETE FROM `db`.`db1`
    89. ### WHERE
    90. ### @1=2 /* INT meta=0 nullable=1 is_null=0 */
    91. ### @2='xiaozhang' /* VARSTRING(90) meta=90 nullable=1 is_null=0 */
    92. ### @3=34 /* INT meta=0 nullable=1 is_null=0 */
    93. ### DELETE FROM `db`.`db1`
    94. ### WHERE
    95. ### @1=3 /* INT meta=0 nullable=1 is_null=0 */
    96. ### @2='zhangsan' /* VARSTRING(90) meta=90 nullable=1 is_null=0 */
    97. ### @3=42 /* INT meta=0 nullable=1 is_null=0 */
    98. # at 1086
    99. #231007 19:48:10 server id 1 end_log_pos 1117 CRC32 0x6cca4c23 Xid = 13
    100. COMMIT/*!*/;
    101. SET @@SESSION.GTID_NEXT= 'AUTOMATIC' /* added by mysqlbinlog */ /*!*/;
    102. DELIMITER ;
    103. # End of log file
    104. /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
    105. /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

    3.找到要恢复的起始位置,和结束位置

    由题可知要恢复的起始位置和结束位置分别为648,950

    1. [root@localhost log]# mysqlbinlog --start-position 648 --stop-position 950 mysql-bin.000002 |mysql -uroot -p123
    2. mysql: [Warning] Using a password on the command line interface can be insecure.

    4.进入数据库查看数据是否恢复

    1. mysql> select * from db.db1;
    2. +------+-----------+------+
    3. | id | name | age |
    4. +------+-----------+------+
    5. | 1 | xiaoli | 23 |
    6. | 2 | xiaozhang | 34 |
    7. | 3 | zhangsan | 42 |
    8. +------+-----------+------+
    9. 3 rows in set (0.00 sec)

    扩展: 根据binlog日志的时间点恢复

    1. [root@localhost log]# mysqlbinlog --start-datetime='2023-10-07 19:47:58' --stop-datetime='2023-10-07 19:48:10' mysql-bin.000002 |mysql -uroot -p123
    2. mysql: [Warning] Using a password on the command line interface can be insecure.
    1. mysql> select * from db.db1;
    2. +------+-----------+------+
    3. | id | name | age |
    4. +------+-----------+------+
    5. | 1 | xiaoli | 23 |
    6. | 2 | xiaozhang | 34 |
    7. | 3 | zhangsan | 42 |
    8. +------+-----------+------+
    9. 3 rows in set (0.00 sec)

  • 相关阅读:
    Golang Type关键字
    在线图片转文字怎么转?这种方法大家可以学会
    springboot增加过滤器后中文乱码
    js文件模块化引用问题(JavaScript modules)
    Citus 11 for Postgres 完全开源,可从任何节点查询(Citus 官方博客)
    CSS三种样式表、样式表优先级、CSS选择器
    STM32 LWIP Server、Client如何判断网络异常
    Android SELinux
    C++基础与深度解析 | 输入与输出 | 文件与内存操作 | 流的状态、定位与同步
    偷热、窃热行为如何早发现
  • 原文地址:https://blog.csdn.net/2301_78315274/article/details/133383253