前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第19章_数据库备份与恢复

第19章_数据库备份与恢复

作者头像
程序员Leo
发布2023-08-07 21:03:22
4220
发布2023-08-07 21:03:22
举报
文章被收录于专栏:Java知识点

🏠个人主页:shark-Gao

🧑个人简介:大家好,我是 shark-Gao,一个想要与大家共同进步的男人😉😉

🎉目前状况:23 届毕业生,目前在某公司实习👏👏

❤️欢迎大家:这里是 CSDN,我总结知识的地方,欢迎来到我的博客,我亲爱的大佬😘

🖥️个人小站 :个人博客,欢迎大家访问

配套视频参考:MySQL 数据库天花板–康师傅

image-20220718145936444
image-20220718145936444

# 1. 物理备份与逻辑备份

** 物理备份:** 备份数据文件,转储数据库物理文件到某一目录。物理备份恢复速度比较快,但占用空间比较大,MySQL 中可以用 xtrabackup 工具来进行物理备份。

** 逻辑备份:** 对数据库对象利用工具进行导出工作,汇总入备份文件内。逻辑备份恢复速度慢,但占用空间小,更灵活。MySQL 中常用的逻辑备份工具为 mysqldump 。逻辑备份就是 备份sql语句 ,在恢复的 时候执行备份的 sql 语句实现数据库数据的重现。

# 2. mysqldump 实现逻辑备份

mysqldump 是 MySQL 提供的一个非常有用的数据库备份工具。

# 2.1 备份一个数据库

mysqldump 命令执行时,可以将数据库备份成一个 文本文件 ,该文件中实际上包含多个 CREATEINSERT 语句,使用这些语句可以重新创建表和插入数据。

  • 查出需要备份的表的结构,在文本文件中生成一个 CREATE 语句
  • 将表中的所有记录转换为一条 INSERT 语句。

基本语法:

代码语言:javascript
复制
mysqldump –u 用户名称 –h 主机名称 –p密码 待备份的数据库名称[tbname, [tbname...]]> 备份文件名称.sql

说明: 备份的文件并非一定要求后缀名为.sql,例如后缀名为.txt 的文件也是可以的。

举例:使用 root 用户备份 atguigu 数据库:

代码语言:javascript
复制
mysqldump -uroot -p atguigu>atguigu.sql #备份文件存储在当前目录下
代码语言:javascript
复制
mysqldump -uroot -p atguigudb1 > /var/lib/mysql/atguigu.sql

备份文件剖析:

代码语言:javascript
复制
-- MySQL dump 10.13 Distrib 8.0.26, for Linux (x86_64)
--
-- Host: localhost Database: atguigu
-- ------------------------------------------------------
-- Server version 8.0.26

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Current Database: `atguigu`
--

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `atguigu` /*!40100 DEFAULT CHARACTER SET
utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;

USE `atguigu`;

--
-- Table structure for table `student`
--

DROP TABLE IF EXISTS `student`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `student` (
`studentno` int NOT NULL,
`name` varchar(20) DEFAULT NULL,
`class` varchar(20) DEFAULT NULL,
PRIMARY KEY (`studentno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;
/*!40101 SET character_set_client = @saved_cs_client */;
INSERT INTO `student` VALUES (1,'张三_back','一班'),(3,'李四','一班'),(8,'王五','二班'),
(15,'赵六','二班'),(20,'钱七','>三班'),(22,'zhang3_update','1ban'),(24,'wang5','2ban');
/*!40000 ALTER TABLE `student` ENABLE KEYS */;
UNLOCK TABLES;
        .
        .
        .
        .
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2022-01-07 9:58:23

# 2.2 备份全部数据库

若想用 mysqldump 备份整个实例,可以使用 --all-databases 或 -A 参数:

代码语言:javascript
复制
mysqldump -uroot -pxxxxxx --all-databases > all_database.sql
mysqldump -uroot -pxxxxxx -A > all_database.sql

# 2.3 备份部分数据库

使用 --databases-B 参数了,该参数后面跟数据库名称,多个数据库间用空格隔开。如果指定 databases 参数,备份文件中会存在创建数据库的语句,如果不指定参数,则不存在。语法如下:

代码语言:javascript
复制
mysqldump –u user –h host –p --databases [数据库的名称1 [数据库的名称2...]] > 备份文件名称.sql

举例:

代码语言:javascript
复制
mysqldump -uroot -p --databases atguigu atguigu12 >two_database.sql

代码语言:javascript
复制
mysqldump -uroot -p -B atguigu atguigu12 > two_database.sql

# 2.4 备份部分表

比如,在表变更前做个备份。语法如下:

代码语言:javascript
复制
mysqldump –u user –h host –p 数据库的名称 [表名1 [表名2...]] > 备份文件名称.sql

举例:备份 atguigu 数据库下的 book 表

代码语言:javascript
复制
mysqldump -uroot -p atguigu book> book.sql

book.sql 文件内容如下

代码语言:javascript
复制
mysqldump -uroot -p atguigu book> book.sql^C
[root@node1 ~]# ls
kk kubekey kubekey-v1.1.1-linux-amd64.tar.gz README.md test1.sql two_database.sql
[root@node1 ~]# mysqldump -uroot -p atguigu book> book.sql
Enter password:
[root@node1 ~]# ls
book.sql kk kubekey kubekey-v1.1.1-linux-amd64.tar.gz README.md test1.sql
two_database.sql
[root@node1 ~]# vi book.sql
-- MySQL dump 10.13 Distrib 8.0.26, for Linux (x86_64)
--
-- Host: localhost Database: atguigu
-- ------------------------------------------------------
-- Server version 8.0.26

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `book`
--

DROP TABLE IF EXISTS `book`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `book` (
`bookid` int unsigned NOT NULL AUTO_INCREMENT,
`card` int unsigned NOT NULL,
`test` varchar(255) COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`bookid`),
KEY `Y` (`card`)
) ENGINE=InnoDB AUTO_INCREMENT=101 DEFAULT CHARSET=utf8mb3 COLLATE=utf8_bin;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `book`
--

LOCK TABLES `book` WRITE;
/*!40000 ALTER TABLE `book` DISABLE KEYS */;
INSERT INTO `book` VALUES (1,9,NULL),(2,10,NULL),(3,4,NULL),(4,8,NULL),(5,7,NULL),
(6,10,NULL),(7,11,NULL),(8,3,NULL),(9,1,NULL),(10,17,NULL),(11,19,NULL),(12,4,NULL),
(13,1,NULL),(14,14,NULL),(15,5,NULL),(16,5,NULL),(17,8,NULL),(18,3,NULL),(19,12,NULL),
(20,11,NULL),(21,9,NULL),(22,20,NULL),(23,13,NULL),(24,3,NULL),(25,18,NULL),
(26,20,NULL),(27,5,NULL),(28,6,NULL),(29,15,NULL),(30,15,NULL),(31,12,NULL),
(32,11,NULL),(33,20,NULL),(34,5,NULL),(35,4,NULL),(36,6,NULL),(37,17,NULL),
(38,5,NULL),(39,16,NULL),(40,6,NULL),(41,18,NULL),(42,12,NULL),(43,6,NULL),
(44,12,NULL),(45,2,NULL),(46,12,NULL),(47,15,NULL),(48,17,NULL),(49,2,NULL),
(50,16,NULL),(51,13,NULL),(52,17,NULL),(53,7,NULL),(54,2,NULL),(55,9,NULL),
(56,1,NULL),(57,14,NULL),(58,7,NULL),(59,15,NULL),(60,12,NULL),(61,13,NULL),
(62,8,NULL),(63,2,NULL),(64,6,NULL),(65,2,NULL),(66,12,NULL),(67,12,NULL),(68,4,NULL),
(69,5,NULL),(70,10,NULL),(71,16,NULL),(72,8,NULL),(73,14,NULL),(74,5,NULL),
(75,4,NULL),(76,3,NULL),(77,2,NULL),(78,2,NULL),(79,2,NULL),(80,3,NULL),(81,8,NULL),
(82,14,NULL),(83,5,NULL),(84,4,NULL),(85,2,NULL),(86,20,NULL),(87,12,NULL),
(88,1,NULL),(89,8,NULL),(90,18,NULL),(91,3,NULL),(92,3,NULL),(93,6,NULL),(94,1,NULL),
(95,4,NULL),(96,17,NULL),(97,15,NULL),(98,1,NULL),(99,20,NULL),(100,15,NULL);
/*!40000 ALTER TABLE `book` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

可以看到,book 文件和备份的库文件类似。不同的是,book 文件只包含 book 表的 DROP、CREATE 和 INSERT 语句。

备份多张表使用下面的命令,比如备份 book 和 account 表:

代码语言:javascript
复制
#备份多张表
mysqldump -uroot -p atguigu book account > 2_tables_bak.sql

# 2.5 备份单表的部分数据

有些时候一张表的数据量很大,我们只需要部分数据。这时就可以使用 --where 选项了。where 后面附带需要满足的条件。

举例:备份 student 表中 id 小于 10 的数据:

代码语言:javascript
复制
mysqldump -uroot -p atguigu student --where="id < 10 " > student_part_id10_low_bak.sql

内容如下所示,insert 语句只有 id 小于 10 的部分

代码语言:javascript
复制
LOCK TABLES `student` WRITE;
/*!40000 ALTER TABLE `student` DISABLE KEYS */;
INSERT INTO `student` VALUES (1,100002,'JugxTY',157,280),(2,100003,'QyUcCJ',251,277),
(3,100004,'lATUPp',80,404),(4,100005,'BmFsXI',240,171),(5,100006,'mkpSwJ',388,476),
(6,100007,'ujMgwN',259,124),(7,100008,'HBJTqX',429,168),(8,100009,'dvQSQA',61,504),
(9,100010,'HljpVJ',234,185);

# 2.6 排除某些表的备份

如果我们想备份某个库,但是某些表数据量很大或者与业务关联不大,这个时候可以考虑排除掉这些表,同样的,选项 --ignore-table 可以完成这个功能。

代码语言:javascript
复制
mysqldump -uroot -p atguigu --ignore-table=atguigu.student > no_stu_bak.sql

通过如下指定判定文件中没有 student 表结构:

代码语言:javascript
复制
grep "student" no_stu_bak.sql

# 2.7 只备份结构或只备份数据

只备份结构的话可以使用 --no-data 简写为 -d 选项;只备份数据可以使用 --no-create-info 简写为 -t 选项。

只备份结构

代码语言:javascript
复制
mysqldump -uroot -p atguigu --no-data > atguigu_no_data_bak.sql
#使用grep命令,没有找到insert相关语句,表示没有数据备份。
[root@node1 ~]# grep "INSERT" atguigu_no_data_bak.sql
[root@node1 ~]#

只备份数据

代码语言:javascript
复制
mysqldump -uroot -p atguigu --no-create-info > atguigu_no_create_info_bak.sql
#使用grep命令,没有找到create相关语句,表示没有数据结构。
[root@node1 ~]# grep "CREATE" atguigu_no_create_info_bak.sql
[root@node1 ~]#

# 2.8 备份中包含存储过程、函数、事件

mysqldump 备份默认是不包含存储过程,自定义函数及事件的。可以使用 --routines-R 选项来备份存储过程及函数,使用 --events-E 参数来备份事件。

举例:备份整个 atguigu 库,包含存储过程及事件:

  • 使用下面的 SQL 可以查看当前库有哪些存储过程或者函数
代码语言:javascript
复制
mysql> SELECT SPECIFIC_NAME,ROUTINE_TYPE ,ROUTINE_SCHEMA FROM
information_schema.Routines WHERE ROUTINE_SCHEMA="atguigu";
+---------------+--------------+----------------+
| SPECIFIC_NAME | ROUTINE_TYPE | ROUTINE_SCHEMA |
+---------------+--------------+----------------+
| rand_num      | FUNCTION     | atguigu        |
| rand_string   | FUNCTION     | atguigu        |
| BatchInsert   | PROCEDURE    | atguigu        |
| insert_class  | PROCEDURE    | atguigu        |
| insert_order  | PROCEDURE    | atguigu        |
| insert_stu    | PROCEDURE    | atguigu        |
| insert_user   | PROCEDURE    | atguigu        |
| ts_insert     | PROCEDURE    | atguigu        |
+---------------+--------------+----------------+
9 rows in set (0.02 sec)

下面备份 atguigu 库的数据,函数以及存储过程。

代码语言:javascript
复制
mysqldump -uroot -p -R -E --databases atguigu > fun_atguigu_bak.sql

查询备份文件中是否存在函数,如下所示,可以看到确实包含了函数。

代码语言:javascript
复制
grep -C 5 "rand_num" fun_atguigu_bak.sql
--
--
-- Dumping routines for database 'atguigu'
--
/*!50003 DROP FUNCTION IF EXISTS `rand_num` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = utf8mb3 */ ;
/*!50003 SET character_set_results = utf8mb3 */ ;
/*!50003 SET collation_connection = utf8_general_ci */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode =
'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISIO
N_BY_ZERO,NO_ENGINE_SUBSTITUTION' */ ;
DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `rand_num`(from_num BIGINT ,to_num BIGINT) RETURNS
bigint
BEGIN
DECLARE i BIGINT DEFAULT 0;
SET i = FLOOR(from_num +RAND()*(to_num - from_num+1)) ;
RETURN i;
END ;;
--
BEGIN
DECLARE i INT DEFAULT 0;
    SET autocommit = 0;
    REPEAT
    SET i = i + 1;
    INSERT INTO class ( classname,address,monitor ) VALUES
    (rand_string(8),rand_string(10),rand_num());
    UNTIL i = max_num
    END REPEAT;
    COMMIT;
END ;;
DELIMITER ;
--
BEGIN
DECLARE i INT DEFAULT 0;
    SET autocommit = 0; #设置手动提交事务
    REPEAT #循环
    SET i = i + 1; #赋值
    INSERT INTO order_test (order_id, trans_id ) VALUES
    (rand_num(1,7000000),rand_num(100000000000000000,700000000000000000));
    UNTIL i = max_num
    END REPEAT;
    COMMIT; #提交事务
END ;;
DELIMITER ;
--
BEGIN
DECLARE i INT DEFAULT 0;
    SET autocommit = 0; #设置手动提交事务
    REPEAT #循环
    SET i = i + 1; #赋值
    INSERT INTO student (stuno, name ,age ,classId ) VALUES
    ((START+i),rand_string(6),rand_num(),rand_num());
    UNTIL i = max_num
    END REPEAT;
    COMMIT; #提交事务
END ;;
DELIMITER ;
--
BEGIN
DECLARE i INT DEFAULT 0;
    SET autocommit = 0;
    REPEAT
    SET i = i + 1;
    INSERT INTO `user` ( name,age,sex ) VALUES ("atguigu",rand_num(1,20),"male");
    UNTIL i = max_num
    END REPEAT;
    COMMIT;
END ;;
DELIMITER ;

# 2.9 mysqldump 常用选项

mysqldump 其他常用选项如下:

代码语言:javascript
复制
--add-drop-database:在每个CREATE DATABASE语句前添加DROP DATABASE语句。

--add-drop-tables:在每个CREATE TABLE语句前添加DROP TABLE语句。

--add-locking:用LOCK TABLES和UNLOCK TABLES语句引用每个表转储。重载转储文件时插入得更快。

--all-database, -A:转储所有数据库中的所有表。与使用--database选项相同,在命令行中命名所有数据库。

--comment[=0|1]:如果设置为0,禁止转储文件中的其他信息,例如程序版本、服务器版本和主机。--skipcomments与--comments=0的结果相同。默认值为1,即包括额外信息。

--compact:产生少量输出。该选项禁用注释并启用--skip-add-drop-tables、--no-set-names、--skipdisable-keys和--skip-add-locking选项。

--compatible=name:产生与其他数据库系统或旧的MySQL服务器更兼容的输出,值可以为ansi、MySQL323、MySQL40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_table_options或者no_field_options。

--complete_insert, -c:使用包括列名的完整的INSERT语句。

--debug[=debug_options], -#[debug_options]:写调试日志。

--delete,-D:导入文本文件前清空表。

--default-character-set=charset:使用charsets默认字符集。如果没有指定,就使用utf8。

--delete--master-logs:在主复制服务器上,完成转储操作后删除二进制日志。该选项自动启用-masterdata。

--extended-insert,-e:使用包括几个VALUES列表的多行INSERT语法。这样使得转储文件更小,重载文件时可以加速插入。

--flush-logs,-F:开始转储前刷新MySQL服务器日志文件。该选项要求RELOAD权限。

--force,-f:在表转储过程中,即使出现SQL错误也继续。

--lock-all-tables,-x:对所有数据库中的所有表加锁。在整体转储过程中通过全局锁定来实现。该选项自动关闭--single-transaction和--lock-tables。

--lock-tables,-l:开始转储前锁定所有表。用READ LOCAL锁定表以允许并行插入MyISAM表。对于事务表(例如InnoDB和BDB),--single-transaction是一个更好的选项,因为它根本不需要锁定表。

--no-create-db,-n:该选项禁用CREATE DATABASE /*!32312 IF NOT EXIST*/db_name语句,如果给出--database或--all-database选项,就包含到输出中。

--no-create-info,-t:只导出数据,而不添加CREATE TABLE语句。

--no-data,-d:不写表的任何行信息,只转储表的结构。

--opt:该选项是速记,它可以快速进行转储操作并产生一个能很快装入MySQL服务器的转储文件。该选项默认开启,但可以用--skip-opt禁用。

--password[=password],-p[password]:当连接服务器时使用的密码。

-port=port_num,-P port_num:用于连接的TCP/IP端口号。

--protocol={TCP|SOCKET|PIPE|MEMORY}:使用的连接协议。

--replace,-r –replace和--ignore:控制替换或复制唯一键值已有记录的输入记录的处理。如果指定--replace,新行替换有相同的唯一键值的已有行;如果指定--ignore,复制已有的唯一键值的输入行被跳过。如果不指定这两个选项,当发现一个复制键值时会出现一个错误,并且忽视文本文件的剩余部分。

--silent,-s:沉默模式。只有出现错误时才输出。

--socket=path,-S path:当连接localhost时使用的套接字文件(为默认主机)。

--user=user_name,-u user_name:当连接服务器时MySQL使用的用户名。

--verbose,-v:冗长模式,打印出程序操作的详细信息。

--xml,-X:产生XML输出。

运行帮助命令 mysqldump --help ,可以获得特定版本的完整选项列表。

提示 如果运行 mysqldump 没有–quick 或–opt 选项,mysqldump 在转储结果前将整个结果集装入内 存。如果转储大数据库可能会出现问题,该选项默认启用,但可以用–skip-opt 禁用。如果使用最 新版本的 mysqldump 程序备份数据,并用于恢复到比较旧版本的 MySQL 服务器中,则不要使用–opt 或 - e 选项。

# 3. mysql 命令恢复数据

使用 mysqldump 命令将数据库中的数据备份成一个文本文件。需要恢复时,可以使用 mysql命令 来恢复备份的数据。

mysql 命令可以执行备份文件中的 CREATE语句INSERT语句 。通过 CREATE 语句来创建数据库和表。通过 INSERT 语句来插入备份的数据。

基本语法:

代码语言:javascript
复制
mysql –u root –p [dbname] < backup.sql

其中,dbname 参数表示数据库名称。该参数是可选参数,可以指定数据库名,也可以不指定。指定数据库名时,表示还原该数据库下的表。此时需要确保 MySQL 服务器中已经创建了该名的数据库。不指定数据库名,表示还原文件中所有的数据库。此时 sql 文件中包含有 CREATE DATABASE 语句,不需要 MySQL 服务器中已存在的这些数据库。

# 3.1 单库备份中恢复单库

使用 root 用户,将之前练习中备份的 atguigu.sql 文件中的备份导入数据库中,命令如下:

如果备份文件中包含了创建数据库的语句,则恢复的时候不需要指定数据库名称,如下所示

代码语言:javascript
复制
mysql -uroot -p < atguigu.sql

否则需要指定数据库名称,如下所示

代码语言:javascript
复制
mysql -uroot -p atguigu4< atguigu.sql

# 3.2 全量备份恢复

如果我们现在有昨天的全量备份,现在想整个恢复,则可以这样操作:

代码语言:javascript
复制
mysql –u root –p < all.sql
代码语言:javascript
复制
mysql -uroot -pxxxxxx < all.sql

执行完后,MySQL 数据库中就已经恢复了 all.sql 文件中的所有数据库。

# 3.3 全量备份恢复

可能有这样的需求,比如说我们只想恢复某一个库,但是我们有的是整个实例的备份,这个时候我们可以从全量备份中分离出单个库的备份。

举例:

代码语言:javascript
复制
sed -n '/^-- Current Database: `atguigu`/,/^-- Current Database: `/p' all_database.sql > atguigu.sql
#分离完成后我们再导入atguigu.sql即可恢复单个库

# 3.4 从单库备份中恢复单表

这个需求还是比较常见的。比如说我们知道哪个表误操作了,那么就可以用单表恢复的方式来恢复。

举例:我们有 atguigu 整库的备份,但是由于 class 表误操作,需要单独恢复出这张表。

代码语言:javascript
复制
cat atguigu.sql | sed -e '/./{H;$!d;}' -e 'x;/CREATE TABLE `class`/!d;q' > class_structure.sql
cat atguigu.sql | grep --ignore-case 'insert into `class`' > class_data.sql
#用shell语法分离出创建表的语句及插入数据的语句后 再依次导出即可完成恢复

use atguigu;
mysql> source class_structure.sql;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> source class_data.sql;
Query OK, 1 row affected (0.01 sec)

# 4. 物理备份:直接复制整个数据库

直接将 MySQL 中的数据库文件复制出来。这种方法最简单,速度也最快。MySQL 的数据库目录位置不一 定相同:

  • 在 Windows 平台下,MySQL 8.0 存放数据库的目录通常默认为 “C:\ProgramData\MySQL\MySQL Server 8.0\Data” 或者其他用户自定义目录;
  • 在 Linux 平台下,数据库目录位置通常为 /var/lib/mysql/;
  • 在 MAC OSX 平台下,数据库目录位置通常为 “/usr/local/mysql/data”

但为了保证备份的一致性。需要保证:

  • 方式 1:备份前,将服务器停止。
  • 方式 2:备份前,对相关表执行 FLUSH TABLES WITH READ LOCK 操作。这样当复制数据库目录中 的文件时,允许其他客户继续查询表。同时,FLUSH TABLES 语句来确保开始备份前将所有激活的索 引页写入硬盘。

这种方式方便、快速,但不是最好的备份方法,因为实际情况可能 不允许停止MySQL服务器 或者 锁住表 ,而且这种方法 对 InnoDB 存储引擎 的表不适用。对于 MyISAM 存储引擎的表,这样备份和还原很方便,但是还原时最好是相同版本的 MySQL 数据库,否则可能会存在文件类型不同的情况。

注意,物理备份完毕后,执行 UNLOCK TABLES 来结算其他客户对表的修改行为。

说明: 在 MySQL 版本号中,第一个数字表示主版本号,主版本号相同的 MySQL 数据库文件格式相同。

此外,还可以考虑使用相关工具实现备份。比如, MySQLhotcopy 工具。MySQLhotcopy 是一个 Perl 脚本,它使用 LOCK TABLES、FLUSH TABLES 和 cp 或 scp 来快速备份数据库。它是备份数据库或单个表最快的途径,但它只能运行在数据库目录所在的机器上,并且只能备份 MyISAM 类型的表。多用于 mysql5.5 之前。

# 5. 物理恢复:直接复制到数据库目录

步骤:

1)演示删除备份的数据库中指定表的数据

2)将备份的数据库数据拷贝到数据目录下,并重启 MySQL 服务器

3)查询相关表的数据是否恢复。需要使用下面的 chown 操作。

要求:

  • 必须确保备份数据的数据库和待恢复的数据库服务器的主版本号相同。
    • 因为只有 MySQL 数据库主版本号相同时,才能保证这两个 MySQL 数据库文件类型是相同的。
  • 这种方式对 MyISAM类型的表比较有效 ,对于 InnoDB 类型的表则不可用。
    • 因为 InnoDB 表的表空间不能直接复制。
  • 在 Linux 操作系统下,复制到数据库目录后,一定要将数据库的用户和组变成 mysql,命令如下:
代码语言:javascript
复制
chown -R mysql.mysql /var/lib/mysql/dbname

其中,两个 mysql 分别表示组和用户;“-R” 参数可以改变文件夹下的所有子文件的用户和组;“dbname” 参数表示数据库目录。

提示 Linux 操作系统下的权限设置非常严格。通常情况下,MySQL 数据库只有 root 用户和 mysql 用户 组下的 mysql 用户才可以访问,因此将数据库目录复制到指定文件夹后,一定要使用 chown 命令将 文件夹的用户组变为 mysql,将用户变为 mysql。

# 6. 表的导出与导入

# 6.1 表的导出

# 1. 使用 SELECT…INTO OUTFILE 导出文本文件

在 MySQL 中,可以使用 SELECT…INTO OUTFILE 语句将表的内容导出成一个文本文件。

** 举例:** 使用 SELECT…INTO OUTFILE 将 atguigu 数据库中 account 表中的记录导出到文本文件。

(1)选择数据库 atguigu,并查询 account 表,执行结果如下所示。

代码语言:javascript
复制
use atguigu;
select * from account;
mysql> select * from account;
+----+--------+---------+
| id | name | balance |
+----+--------+---------+
| 1 | 张三 | 90 |
| 2 | 李四 | 100 |
| 3 | 王五 | 0 |
+----+--------+---------+
3 rows in set (0.01 sec)

(2)mysql 默认对导出的目录有权限限制,也就是说使用命令行进行导出的时候,需要指定目录进行操作。

查询 secure_file_priv 值:

代码语言:javascript
复制
mysql> SHOW GLOBAL VARIABLES LIKE '%secure%';
+--------------------------+-----------------------+
| Variable_name            | Value                 |
+--------------------------+-----------------------+
| require_secure_transport | OFF                   |
| secure_file_priv         | /var/lib/mysql-files/ |
+--------------------------+-----------------------+
2 rows in set (0.02 sec)
image-20220718163627669
image-20220718163627669

(3)上面结果中显示,secure_file_priv 变量的值为 /var/lib/mysql-files/,导出目录设置为该目录,SQL 语句如下。

代码语言:javascript
复制
SELECT * FROM account INTO OUTFILE "/var/lib/mysql-files/account.txt";

(4)查看 /var/lib/mysql-files/account.txt` 文件。

代码语言:javascript
复制
1 张三 90
2 李四 100
3 王五 0
# 2. 使用 mysqldump 命令导出文本文件

** 举例 1:** 使用 mysqldump 命令将将 atguigu 数据库中 account 表中的记录导出到文本文件:

代码语言:javascript
复制
mysqldump -uroot -p -T "/var/lib/mysql-files/" atguigu account

mysqldump 命令执行完毕后,在指定的目录 /var/lib/mysql-files/ 下生成了 account.sql 和 account.txt 文件。

打开 account.sql 文件,其内容包含创建 account 表的 CREATE 语句。

代码语言:javascript
复制
[root@node1 mysql-files]# cat account.sql
-- MySQL dump 10.13 Distrib 8.0.26, for Linux (x86_64)
--
-- Host: localhost Database: atguigu
-- ------------------------------------------------------
-- Server version 8.0.26
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

--
-- Table structure for table `account`
--

DROP TABLE IF EXISTS `account`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `account` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`balance` int NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb3;
/*!40101 SET character_set_client = @saved_cs_client */;

/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2022-01-07 23:19:27

打开 account.txt 文件,其内容只包含 account 表中的数据。

代码语言:javascript
复制
[root@node1 mysql-files]# cat account.txt
1 张三 90
2 李四 100
3 王五 0

** 举例 2:** 使用 mysqldump 将 atguigu 数据库中的 account 表导出到文本文件,使用 FIELDS 选项,要求字段之 间使用逗号 “,” 间隔,所有字符类型字段值用双引号括起来:

代码语言:javascript
复制
mysqldump -uroot -p -T "/var/lib/mysql-files/" atguigu account --fields-terminatedby=',' --fields-optionally-enclosed-by='\"'

语句 mysqldump 语句执行成功之后,指定目录下会出现两个文件 account.sql 和 account.txt。

打开 account.sql 文件,其内容包含创建 account 表的 CREATE 语句。

代码语言:javascript
复制
[root@node1 mysql-files]# cat account.sql
-- MySQL dump 10.13 Distrib 8.0.26, for Linux (x86_64)
--
-- Host: localhost Database: atguigu
-- ------------------------------------------------------
-- Server version 8.0.26
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!50503 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `account`
--
DROP TABLE IF EXISTS `account`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `account` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`balance` int NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb3;
/*!40101 SET character_set_client = @saved_cs_client */;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2022-01-07 23:36:39

打开 account.txt 文件,其内容包含创建 account 表的数据。从文件中可以看出,字段之间用逗号隔开,字 符类型的值被双引号括起来。

代码语言:javascript
复制
[root@node1 mysql-files]# cat account.txt
1,"张三",90
2,"李四",100
3,"王五",0
# 3. 使用 mysql 命令导出文本文件

** 举例 1:** 使用 mysql 语句导出 atguigu 数据中 account 表中的记录到文本文件:

代码语言:javascript
复制
mysql -uroot -p --execute="SELECT * FROM account;" atguigu> "/var/lib/mysql-files/account.txt"

打开 account.txt 文件,其内容包含创建 account 表的数据。

代码语言:javascript
复制
[root@node1 mysql-files]# cat account.txt
id name balance
1 张三 90
2 李四 100
3 王五 0

** 举例 2:** 将 atguigu 数据库 account 表中的记录导出到文本文件,使用–veritcal 参数将该条件记录分为多行显示:

代码语言:javascript
复制
mysql -uroot -p --vertical --execute="SELECT * FROM account;" atguigu > "/var/lib/mysql-files/account_1.txt"

打开 account_1.txt 文件,其内容包含创建 account 表的数据。

代码语言:javascript
复制
[root@node1 mysql-files]# cat account_1.txt
*************************** 1. row ***************************
id: 1
name: 张三
balance: 90
*************************** 2. row ***************************
id: 2
name: 李四
balance: 100
*************************** 3. row ***************************
id: 3
name: 王五
balance: 0

** 举例 3:** 将 atguigu 数据库 account 表中的记录导出到 xml 文件,使用–xml 参数,具体语句如下。

代码语言:javascript
复制
mysql -uroot -p --xml --execute="SELECT * FROM account;" atguigu>"/var/lib/mysqlfiles/account_3.xml"
代码语言:javascript
复制
[root@node1 mysql-files]# cat account_3.xml
<?xml version="1.0"?>
<resultset statement="SELECT * FROM account"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<row>
<field name="id">1</field>
<field name="name">张三</field>
<field name="balance">90</field>
</row>
<row>
<field name="id">2</field>
<field name="name">李四</field>
<field name="balance">100</field>
</row>
<row>
<field name="id">3</field>
<field name="name">王五</field>
<field name="balance">0</field>
</row>
</resultset>

说明:如果要将表数据导出到 html 文件中,可以使用 --html 选项。然后可以使用浏览器打开。

# 6.2 表的导入

# 1. 使用 LOAD DATA INFILE 方式导入文本文件

举例 1:

使用 SELECT…INTO OUTFILE 将 atguigu 数据库中 account 表的记录导出到文本文件

代码语言:javascript
复制
SELECT * FROM atguigu.account INTO OUTFILE '/var/lib/mysql-files/account_0.txt';

删除 account 表中的数据:

代码语言:javascript
复制
DELETE FROM atguigu.account;

从文本文件 account.txt 中恢复数据:

代码语言:javascript
复制
LOAD DATA INFILE '/var/lib/mysql-files/account_0.txt' INTO TABLE atguigu.account;

查询 account 表中的数据:

代码语言:javascript
复制
mysql> select * from account;
+----+--------+---------+
| id | name   | balance |
+----+--------+---------+
| 1 | 张三     | 90      |
| 2 | 李四     | 100     |
| 3 | 王五     | 0       |
+----+--------+---------+
3 rows in set (0.00 sec)

举例 2: 选择数据库 atguigu,使用 SELECT…INTO OUTFILE 将 atguigu 数据库 account 表中的记录导出到文本文件,使用 FIELDS 选项和 LINES 选项,要求字段之间使用逗号 "," 间隔,所有字段值用双引号括起来:

代码语言:javascript
复制
SELECT * FROM atguigu.account INTO OUTFILE '/var/lib/mysql-files/account_1.txt' FIELDS TERMINATED BY ',' ENCLOSED BY '\"';

删除 account 表中的数据:

代码语言:javascript
复制
DELETE FROM atguigu.account;

从 /var/lib/mysql-files/account.txt 中导入数据到 account 表中:

代码语言:javascript
复制
LOAD DATA INFILE '/var/lib/mysql-files/account_1.txt' INTO TABLE atguigu.account FIELDS TERMINATED BY ',' ENCLOSED BY '\"';

查询 account 表中的数据,具体 SQL 如下:

代码语言:javascript
复制
select * from account;
mysql> select * from account;
+----+--------+---------+
| id | name   | balance |
+----+--------+---------+
| 1 | 张三     | 90      |
| 2 | 李四     | 100     |
| 3 | 王五     | 0       |
+----+--------+---------+
3 rows in set (0.00 sec)
# 2. 使用 mysqlimport 方式导入文本文件

举例:

导出文件 account.txt,字段之间使用逗号 "," 间隔,字段值用双引号括起来:

代码语言:javascript
复制
SELECT * FROM atguigu.account INTO OUTFILE '/var/lib/mysql-files/account.txt' FIELDS TERMINATED BY ',' ENCLOSED BY '\"';

删除 account 表中的数据:

代码语言:javascript
复制
DELETE FROM atguigu.account;

使用 mysqlimport 命令将 account.txt 文件内容导入到数据库 atguigu 的 account 表中:

代码语言:javascript
复制
mysqlimport -uroot -p atguigu '/var/lib/mysql-files/account.txt' --fields-terminated-by=',' --fields-optionally-enclosed-by='\"'

查询 account 表中的数据:

代码语言:javascript
复制
select * from account;
mysql> select * from account;
+----+--------+---------+
| id | name   | balance |
+----+--------+---------+
| 1 | 张三     | 90      |
| 2 | 李四     | 100     |
| 3 | 王五     | 0       |
+----+--------+---------+
3 rows in set (0.00 sec)

# 7. 数据库迁移

# 7.1 概述

数据迁移(data migration)是指选择、准备、提取和转换数据,并将数据从一个计算机存储系统永久地传输到另一个计算机存储系统的过程。此外, 验证迁移数据的完整性退役原来旧的数据存储 ,也被认为是整个数据迁移过程的一部分。

数据库迁移的原因是多样的,包括服务器或存储设备更换、维护或升级,应用程序迁移,网站集成,灾难恢复和数据中心迁移。

根据不同的需求可能要采取不同的迁移方案,但总体来讲,MySQL 数据迁移方案大致可以分为 物理迁移逻辑迁移 两类。通常以尽可能 自动化 的方式执行,从而将人力资源从繁琐的任务中解放出来。

# 7.2 迁移方案

  • 物理迁移

物理迁移适用于大数据量下的整体迁移。使用物理迁移方案的优点是比较快速,但需要停机迁移并且要 求 MySQL 版本及配置必须和原服务器相同,也可能引起未知问题。

物理迁移包括拷贝数据文件和使用 XtraBackup 备份工具两种。

不同服务器之间可以采用物理迁移,我们可以在新的服务器上安装好同版本的数据库软件,创建好相同目录,建议配置文件也要和原数据库相同,然后从原数据库方拷贝来数据文件及日志文件,配置好文件组权限,之后在新服务器这边使用 mysqld 命令启动数据库。

  • 逻辑迁移

逻辑迁移适用范围更广,无论是 部分迁移 还是 全量迁移 ,都可以使用逻辑迁移。逻辑迁移中使用最多的就是通过 mysqldump 等备份工具。

# 7.3 迁移注意点

1. 相同版本的数据库之间迁移注意点

指的是在主版本号相同的 MySQL 数据库之间进行数据库移动。

方式1 : 因为迁移前后 MySQL 数据库的 主版本号相同 ,所以可以通过复制数据库目录来实现数据库迁移,但是物理迁移方式只适用于 MyISAM 引擎的表。对于 InnoDB 表,不能用直接复制文件的方式备份数据库。

方式2 : 最常见和最安全的方式是使用 mysqldump命令 导出数据,然后在目标数据库服务器中使用 MySQL 命令导入。

举例:

代码语言:javascript
复制
#host1的机器中备份所有数据库,并将数据库迁移到名为host2的机器上
mysqldump –h host1 –uroot –p –-all-databases|
mysql –h host2 –uroot –p

在上述语句中,“|” 符号表示管道,其作用是将 mysqldump 备份的文件给 mysql 命令;“–all-databases” 表示要迁移所有的数据库。通过这种方式可以直接实现迁移。

2. 不同版本的数据库之间迁移注意点

例如,原来很多服务器使用 5.7 版本的 MySQL 数据库,在 8.0 版本推出来以后,改进了 5.7 版本的很多缺陷, 因此需要把数据库升级到 8.0 版本

旧版本与新版本的 MySQL 可能使用不同的默认字符集,例如有的旧版本中使用 latin1 作为默认字符集,而最新版本的 MySQL 默认字符集为 utf8mb4。如果数据库中有中文数据,那么迁移过程中需要对 默认字符集 进行修改 ,不然可能无法正常显示数据。

高版本的 MySQL 数据库通常都会 兼容低版本 ,因此可以从低版本的 MySQL 数据库迁移到高版本的 MySQL 数据库。

3. 不同数据库之间迁移注意点

不同数据库之间迁移是指从其他类型的数据库迁移到 MySQL 数据库,或者从 MySQL 数据库迁移到其他类 型的数据库。这种迁移没有普适的解决方法。

迁移之前,需要了解不同数据库的架构, 比较它们之间的差异 。不同数据库中定义相同类型的数据的 关键字可能会不同 。例如,MySQL 中日期字段分为 DATE 和 TIME 两种,而 ORACLE 日期字段只有 DATE;SQL Server 数据库中有 ntext、Image 等数据类型,MySQL 数据库没有这些数据类型;MySQL 支持的 ENUM 和 SET 类型,这些 SQL Server 数据库不支持。

另外,数据库厂商并没有完全按照 SQL 标准来设计数据库系统,导致不同的数据库系统的 SQL语句 有差别。例如,微软的 SQL Server 软件使用的是 T-SQL 语句,T-SQL 中包含了非标准的 SQL 语句,不能和 MySQL 的 SQL 语句兼容。

不同类型数据库之间的差异造成了互相 迁移的困难 ,这些差异其实是商业公司故意造成的技术壁垒。但 是不同类型的数据库之间的迁移并 不是完全不可能 。例如,可以使用 MyODBC 实现 MySQL 和 SQL Server 之 间的迁移。MySQL 官方提供的工具 MySQL Migration Toolkit 也可以在不同数据之间进行数据迁移。 MySQL 迁移到 Oracle 时,需要使用 mysqldump 命令导出 sql 文件,然后, 手动更改 sql 文件中的 CREATE 语句。

# 7.4 迁移小结

image-20220718165515965
image-20220718165515965

# 8. 删库了不敢跑,能干点啥?

image-20220718165738367
image-20220718165738367

# 8.1 delete:误删行

image-20220718165909464
image-20220718165909464

# 8.2 truncate/drop :误删库 / 表

image-20220718170026929
image-20220718170026929

# 8.3 预防使用 truncate/drop 误删库 / 表

image-20220718170132339
image-20220718170132339
image-20220718170215247
image-20220718170215247

# 8.4 rm:误删 MySQL 实例

对于一个有高可用机制的 MySQL 集群来说,不用担心 rm 删除数据 了。只是删掉了其中某一个节点的数据的话,HA 系统就会开始工作,选出一个新的主库,从而保证整个集群的正常工作。我们要做的就是在这个节点上把数据恢复回来,再接入整个集群。

但如果是恶意地把整个集群删除,那就需要考虑跨机房备份,跨城市备份。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-04-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • # 1. 物理备份与逻辑备份
  • # 2. mysqldump 实现逻辑备份
    • # 2.1 备份一个数据库
      • # 2.2 备份全部数据库
        • # 2.3 备份部分数据库
          • # 2.4 备份部分表
            • # 2.5 备份单表的部分数据
              • # 2.6 排除某些表的备份
                • # 2.7 只备份结构或只备份数据
                  • # 2.8 备份中包含存储过程、函数、事件
                    • # 2.9 mysqldump 常用选项
                    • # 3. mysql 命令恢复数据
                      • # 3.1 单库备份中恢复单库
                        • # 3.2 全量备份恢复
                          • # 3.3 全量备份恢复
                            • # 3.4 从单库备份中恢复单表
                            • # 4. 物理备份:直接复制整个数据库
                            • # 5. 物理恢复:直接复制到数据库目录
                            • # 6. 表的导出与导入
                              • # 6.1 表的导出
                                • # 1. 使用 SELECT…INTO OUTFILE 导出文本文件
                                • # 2. 使用 mysqldump 命令导出文本文件
                                • # 3. 使用 mysql 命令导出文本文件
                              • # 6.2 表的导入
                                • # 1. 使用 LOAD DATA INFILE 方式导入文本文件
                                • # 2. 使用 mysqlimport 方式导入文本文件
                            • # 7. 数据库迁移
                              • # 7.1 概述
                                • # 7.2 迁移方案
                                  • # 7.3 迁移注意点
                                    • # 7.4 迁移小结
                                    • # 8. 删库了不敢跑,能干点啥?
                                      • # 8.1 delete:误删行
                                        • # 8.2 truncate/drop :误删库 / 表
                                          • # 8.3 预防使用 truncate/drop 误删库 / 表
                                            • # 8.4 rm:误删 MySQL 实例
                                            相关产品与服务
                                            数据库
                                            云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
                                            领券
                                            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档