在操作数据库时,难免会发生一些意外造成数据丢失。例如,突然停电、管理员的操作失误都可能导致数据的丢失。为了确保数据的安全,需要定期对数据库进行备份,这样,当遇到数据库中数据丢失或者出错的情况,就可以将数据进行还原,从而最大限度地降低损失。本节将针对数据的备份和还原进行详细的讲解。
日常生活中,人们经常需要为自己家的房门多配几把钥匙,为自己的爱车准备一个备胎,这些事情其实都是在做备份。在数据库的维护过程中,数据也经常需要备份,以便在系统遭到破坏或其他情况下重新加以利用,为了完成这种功能,MySQL 提供了一个mysqldump 命令,它可以实现数据的备份。
mysqldump 命令可以备份单个数据库、多个数据库和所有数据库,由于这三种备份方式比较类似,所以本节就以备份单个数据库为例来讲解 mysqldump 命令,其他方式只列举语法格式,具体如下。
1、备份单个数据库
mysqldump -uusername -ppassword dbname [tbname1 [tbname2……]]>filename.sql
上述语法格式中,-u后面的参数 username 表示用户名,p后面的参数 password 表示登录密码,dbname表示需要备份的数据库名称,tbname表示数据库中的表名,可以指定一个或多个表,多个表名之间用空格分隔,如果不指定则备份整个数据库,filename.sql表示备份文件的名称,文件名前可以加上绝对路径。
需要注意的是,在使用 mysqldump 命令备份数据库时,直接在 DOS 命令行窗口中执行该命令即可,不需要登录到 MySQL 数据库。
接下来通过具体的案例来演示,在演示之前创建一个名称为 chapter08 的数据库,并在数据库中创建表 student,插人相应数据,SQL 语句如下:
mysql> CREATE DATABASE chapter08;
Query OK, 1 row affected (0.02 sec)mysql> USE chapter08;
Database changed
mysql> CREATE TABLE student(-> id int primary key auto_increment,-> name varchar(20),-> age int-> );
Query OK, 0 rows affected (0.02 sec)mysql> INSERT INTO student(name,age) VALUES('Tom',20);
Query OK, 1 row affected (0.01 sec)mysql> INSERT INTO student(name,age) VALUES('Jack',16);
Query OK, 1 row affected (0.00 sec)mysql> INSERT INTO student(name,age) VALUES('Lucy',18);
Query OK, 1 row affected (0.01 sec)
上述 SQL语句执行成功后。为了验证数据是否添加成功,使用 SELECT语句查询表 student,查询结果如下:
mysql> SELECT * FROM student;
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | Tom | 20 |
| 2 | Jack | 16 |
| 3 | Lucy | 18 |
+----+------+------+
3 rows in set (0.00 sec)
从上述查询结果可以看出,数据添加成功了.
例如,首先在用户目录下创建一个名为 backup 的文件夹用于存放备份好的文件,然后重新开启一个 DOS 命令行窗口(不用登录到 MySQL 数据库),使用 mysqldump 命令备份 chapter08 数据库,mysqldump 语句如下:
mysqldump -uroot -p123456 chapter08>/Users/enjoy/buckup/chapter08.sgl
上述语句执行成功后,会在 backup 文件夹中生成一个名为 chapter08.sql的备份文件,使用记事本打开该文件,可以看到如下所示的内容:
-- MySQL dump 10.13 Distrib 8.0.31, for macos12 (arm64)
--
-- Host: localhost Database: chapter08
-- ------------------------------------------------------
-- Server version 8.0.31/*!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 `student`
--DROP TABLE IF EXISTS `student`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `student` (`id` int NOT NULL AUTO_INCREMENT,`name` varchar(20) DEFAULT NULL,`age` int DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;--
-- Dumping data for table `student`
--LOCK TABLES `student` WRITE;
/*!40000 ALTER TABLE `student` DISABLE KEYS */;
INSERT INTO `student` VALUES (1,'Tom',20),(2,'Jack',16),(3,'Lucy',18);
/*!40000 ALTER TABLE `student` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;/*!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 2024-09-11 16:52:21
从上述文件可以看出,备份文件中会包含 mysqldump 的版本号、MySQL的版本号主机名称、备份的数据库名称,以及一些 SET 语句、CREATE 语句、INSERT 语句、注释信息等。其中以“_”字符开头的都是 SQL的注释;以“/*!”开头、*/”结尾的语句都是可执行的 MySQL 注释,这些语句可以被 MySQL执行,但在其他数据库管理系统中将被作为注释忽略,这可以提高数据库的可移植性。
需要注意的是,以“/*!40101”开头、“*/”结尾的注释语句中,40101是 MySQL数据库的版本号,相当于 MySQL 4.1.1,在还原数据时,如果当前 MySQL 的版本比MySQL 4.1.1高,“/* !40101”和“*/”之间的内容就被当作 SQL命令来执行,如果比当前版本低,“/*!40101”和“*/”之间的内容就被当作注释。
2、备份多个数据库
myeqldump 而令不仅可以备份一个数据,还网时可以备份多个数据痒,其语法格武如下:
mysqldump -uusername -ppassword --database dbname1 [dbname2 dbname3...]>filename.sql
上述语法格式中,"--databnses"参数后面至少原指定一个数据库名称,如果有多个势据库,名称之间用空格隔开。
3、备份所有数据库
使用myeqldump 命令备份所有教据库时,只需在该命今后使用“-alldatabaees”参数即可,其语法格式如下:
mysqldump -uusername -ppassword --all-databases>filename.sql
需要注意的是,如果使用“--all-databases”参教备份了所有的教据库,那么在还原数据库时,不需要创建数据库并指定要操作的教据库,因为对应的备份文件申包含CREATE DATABAS语句和 USE 语句。