ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# 在 MySQL 中导出和导入数据 > 原文: [http://zetcode.com/databases/mysqltutorial/exportimport/](http://zetcode.com/databases/mysqltutorial/exportimport/) 在 MySQL 教程的这一部分中,我们将从 MySQL 数据库导出数据并将数据导入回来。 ## 简单的数据导出 在第一个示例中,我们将数据保存在文本文件中。 ```sql mysql> SELECT * FROM Cars INTO OUTFILE '/tmp/cars'; Query OK, 8 rows affected (0.00 sec) ``` 我们从`Cars`表中选择所有行(8)到`/tmp`目录中的`cars`文件中。 我们需要具有写入该目录的权限。 ```sql $ cat /tmp/cars 1 Audi 52642 2 Mercedes 57127 3 Skoda 9000 4 Volvo 29000 5 Bentley 350000 6 Citroen 21000 7 Hummer 41400 8 Volkswagen 21600 ``` 我们显示文件的内容。 ```sql mysql> DELETE FROM Cars; mysql> LOAD DATA INFILE '/tmp/cars' INTO TABLE Cars; ``` 在第一条语句中,我们删除表中的所有行。 在第二条语句中,我们将所有数据从文本文件加载到`Cars`表中。 ```sql mysql> SELECT * FROM Cars INTO OUTFILE '/tmp/cars.csv' -> FIELDS TERMINATED BY ','; ``` 在上面的 SQL 语句中,我们将`Cars`表中的所有数据转储到`cars.csv`文件中。 `FIELDS TERMINATED BY`子句控制在文本文件中如何终止数据。 我们选择了一个逗号字符。 CSV 代表逗号分隔值,它是一种非常常见且可移植的文件格式。 它可以由许多其他应用(如 OpenOffice,其他数据库等)导入。 ```sql $ cat /tmp/cars.csv 1,Audi,52642 2,Mercedes,57127 3,Skoda,9000 4,Volvo,29000 5,Bentley,350000 6,Citroen,21000 7,Hummer,41400 8,Volkswagen,21600 ``` 这是`cars.csv`文件的内容。 ```sql mysql> DELETE FROM Cars; mysql> LOAD DATA INFILE '/tmp/cars.csv' INTO TABLE Cars -> FIELDS TERMINATED BY ','; mysql> SELECT * FROM Cars; +----+------------+--------+ | Id | Name | Cost | +----+------------+--------+ | 1 | Audi | 52642 | | 2 | Mercedes | 57127 | | 3 | Skoda | 9000 | | 4 | Volvo | 29000 | | 5 | Bentley | 350000 | | 6 | Citroen | 21000 | | 7 | Hummer | 41400 | | 8 | Volkswagen | 21600 | +----+------------+--------+ ``` 我们删除所有数据,然后从`cars.csv`文件中将其还原。 ## 导出到 XML 文件 可以使用`mysql`监视器导出和导入 XML 数据。 ```sql $ mysql -uroot -p --xml -e 'SELECT * FROM mydb.Cars' > /tmp/cars.xml ``` `mysql`监视器具有`--xml`选项,使我们能够以 XML 格式转储数据。 `-e`选项执行一条语句并退出监视器。 ```sql $ cat /tmp/cars.xml <?xml version="1.0"?> <resultset statement="SELECT * FROM mydb.Cars " xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <row> <field name="Id">1</field> <field name="Name">Audi</field> <field name="Cost">52642</field> </row> <row> <field name="Id">2</field> <field name="Name">Mercedes</field> <field name="Cost">57127</field> </row> <row> <field name="Id">3</field> <field name="Name">Skoda</field> <field name="Cost">9000</field> </row> <row> <field name="Id">4</field> <field name="Name">Volvo</field> <field name="Cost">29000</field> </row> <row> <field name="Id">5</field> <field name="Name">Bentley</field> <field name="Cost">350000</field> </row> <row> <field name="Id">6</field> <field name="Name">Citroen</field> <field name="Cost">21000</field> </row> <row> <field name="Id">7</field> <field name="Name">Hummer</field> <field name="Cost">41400</field> </row> <row> <field name="Id">8</field> <field name="Name">Volkswagen</field> <field name="Cost">21600</field> </row> </resultset> ``` 这是`mysql`监视器生成的 XML 文件。 ```sql mysql> TRUNCATE Cars; mysql> LOAD XML /tmp/cars.xml INTO TABLE Cars; ``` 我们截断`Cars`表。 我们从 XML 文件加载数据。 请注意,`LOAD XML`语句可用于 MySQL 5.5 及更高版本。 ## 使用`mysqldump`工具 `mysqldump`是用于为 MySQL 创建备份的命令工具。 当我们将数据从一个地方传输到另一个地方时,会使用转储一词。 从数据库文件到文本文件。 从内存到文件。 和类似。 ### 转储表结构 ```sql mysqldump -u root -p --no-data mydb > bkp1.sql ``` 上面的命令将`mydb`数据库中所有表的表结构转储到`bkq1.sql`文件中。 `--no-data`选项导致不保存数据,仅保存表结构。 ```sql -- -- Table structure for table `Cars` -- DROP TABLE IF EXISTS `Cars`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `Cars` ( `Id` int(11) NOT NULL, `Name` varchar(50) DEFAULT NULL, `Cost` int(11) DEFAULT NULL, PRIMARY KEY (`Id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; /*!40101 SET character_set_client = @saved_cs_client */; ``` 在这里,我们看到了`bkp1.sql`文件的一部分。 这是用于创建`Cars`表的 SQL。 ### 仅转储数据 ```sql $ mysqldump -uroot -p --no-create-info mydb > bkp2.sql ``` 此命令转储`mydb`数据库的所有表中的所有数据。 它省略了表结构。 表结构的遗漏是由`--no-create-info`选项引起的。 ```sql -- -- Dumping data for table `Cars` -- LOCK TABLES `Cars` WRITE; /*!40000 ALTER TABLE `Cars` DISABLE KEYS */; INSERT INTO `Cars` VALUES (1,'Audi',52642),(2,'Mercedes',57127),(3,'Skoda',9000), (4,'Volvo',29000),(5,'Bentley',350000),(6,'Citroen',21000), (7,'Hummer',41400),(8,'Volkswagen',21600); /*!40000 ALTER TABLE `Cars` ENABLE KEYS */; UNLOCK TABLES; ``` 在这里,我们可以看到`Cars`表的数据。 ### 转储整个数据库 ```sql $ mysqldump -uroot -p mydb > bkp3.sql ``` 此命令将所有表从`mydb`数据库转储到`bkp3.sql`文件。 ### 恢复数据 我们展示了如何从备份 SQL 文件还原数据库。 ```sql mysql> DROP DATABASE mydb; ERROR 1010 (HY000): Error dropping database (can't rmdir './mydb/', errno: 17) mysql> SHOW TABLES; Empty set (0.00 sec) ``` 我们删除`mydb`数据库。 显示错误。 表已删除,但数据库未删除。 ```sql $ sudo ls /var/lib/mysql/mydb cars cars.txt $ sudo rm /var/lib/mysql/mydb/cars $ sudo rm /var/lib/mysql/mydb/cars.txt ``` 原因是(在我的情况下)在进行备份时,一些数据写入了`mydb`目录,MySQL 在其中存储了`mydb`数据库。 这两个外来文件无法删除,因此出现上述错误。 通过删除文件,错误已得到解决。 ```sql mysql> DROP DATABASE mydb; Query OK, 0 rows affected (0.04 sec) mysql> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | testdb | | world | +--------------------+ 4 rows in set (0.00 sec) ``` `mydb`数据库已完全删除。 ```sql mysql> CREATE DATABASE mydb; mysql> USE mydb; mysql> source bkp3.sql ``` 我们创建`mydb`数据库。 更改为数据库。 并使用`source`命令执行`bkp3.sql`脚本。 重新创建数据库。 ```sql mysql> SHOW TABLES; +----------------+ | Tables_in_mydb | +----------------+ | AA | | Ages | | Animals | | Authors | | BB | | Books | | Books2 | | Brands | | Cars | ... mysql> SELECT * FROM Cars; +----+------------+--------+ | Id | Name | Cost | +----+------------+--------+ | 1 | Audi | 52642 | | 2 | Mercedes | 57127 | | 3 | Skoda | 9000 | | 4 | Volvo | 29000 | | 5 | Bentley | 350000 | | 6 | Citroen | 21000 | | 7 | Hummer | 41400 | | 8 | Volkswagen | 21600 | +----+------------+--------+ ``` 数据已验证。 在 MySQL 教程的这一部分中,我们展示了几种在 MySQL 中导出和导入数据的方法。