在我们使用数据库的过程中,避免不了备份、恢复、导入、导出数据,方法比较多,根据不同的数据量选择不同的方法,会提高我们的工作效率,

(1)从表A导入数据到表B;一般涉及到表结构相同或者表结构不同等情况,数据量少的时候效率很高,

测试表A为 send_done,创建语句为下面内容,

CREATE TABLE `send_done` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `phone` varchar(20) NOT NULL,
  `content` varchar(1000) NOT NULL,
  `intime` datetime NOT NULL,
  `state` int(11) NOT NULL,
  `sendtime` datetime DEFAULT NULL,
  `statcode` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `ind_state` (`state`)
) ENGINE=InnoDB AUTO_INCREMENT=1166482 DEFAULT CHARSET=utf8
CREATE TABLE `send_sf_done` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `phone` varchar(20) NOT NULL,
  `content` varchar(1000) NOT NULL,
  `intime` datetime NOT NULL,
  `state` int(11) NOT NULL,
  `sendtime` datetime DEFAULT NULL,
  `statcode` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `ind_state` (`state`)
) ENGINE=InnoDB AUTO_INCREMENT=1166482 DEFAULT CHARSET=utf8

表A的数据
MariaDB [wangjubao]> select  *  from  send_done;
+---------+-------------+--------------------------------+---------------------+-------+---------------------+---------------------+
| id      | phone       | content                        | intime              | state | sendtime            | statcode            |
+---------+-------------+--------------------------------+---------------------+-------+---------------------+---------------------+
| 1166459 | 15021970243 | 冬天到了【云信测试】           | 2016-11-04 10:33:02 |     1 | 2016-11-04 10:44:21 | 2114782562554393363 |
| 1166461 | 15021970243 | 冬天到了【云信测试】           | 2016-11-04 10:45:53 |    -3 | 2016-11-04 10:46:05 | -3                  |
| 1166463 | 15021970243 | 冬天到了【云信测试】           | 2016-11-04 10:47:42 |    -3 | 2016-11-04 10:47:54 | -3                  |
| 1166465 | 15021970243 | 冬天到了【云信测试】           | 2016-11-04 10:49:08 |    -3 | 2016-11-04 10:49:19 | -3                  |
| 1166467 | 15021970243 | 冬天到了【云信测试】           | 2016-11-04 10:55:33 |     1 | 2016-11-04 10:55:53 | 2114782569505307918 |
| 1166469 | 15021970243 | 冬天到了【云信测试】           | 2016-11-04 11:10:20 |    -3 | 2016-11-04
+---------+-------------+--------------------------------+---------------------+-------+---------------------+---------------------+
1、从表A导入表B
 insert  into  send_done  select *  from send_sf_done; (字段全部一样时不用写字段)
 2、从表A导出文本加载到B
 导出数据
 select   *  from  send_done  into outfile "/tmp/winn.sql ";
 
 MariaDB [wangjubao]>  select   *  from  send_done  into outfile "/tmp/winn.sql "
    -> ;
Query OK, 12 rows affected (0.00 sec)
 检查导出文件
[root@slave1 tmp]# cat  winn.sql
1166459 15021970243     冬天到了【云信测试】    2016-11-04 10:33:02     1       2016-11-04 10:44:21     2114782562554393363
1166461 15021970243     冬天到了【云信测试】    2016-11-04 10:45:53     -3      2016-11-04 10:46:05     -3
1166463 15021970243     冬天到了【云信测试】    2016-11-04 10:47:42     -3      2016-11-04 10:47:54     -3
1166465 15021970243     冬天到了【云信测试】    2016-11-04 10:49:08     -3      2016-11-04 10:49:19     -3
11:23:36     2114782586244477897
 
删除之前从A表导入B表的数据,
MariaDB [wangjubao]> delete   from send_sf_done;
Query OK, 12 rows affected (0.00 sec)

MariaDB [wangjubao]> select  *  from  send_sf_done;
Empty set (0.00 sec)

加载导出的文件(load data)

load data infile '/tmp/winn.sql' into table  send_sf_done;

MariaDB [wangjubao]> load data infile '/tmp/winn.sql' into table  send_sf_done;
Query OK, 12 rows affected (0.00 sec)               
Records: 12  Deleted: 0  Skipped: 0  Warnings: 0

MariaDB [wangjubao]> select  *  from  send_sf_done;
+---------+-------------+--------------------------------+---------------------+-------+---------------------+---------------------+
| id      | phone       | content                        | intime              | state | sendtime            | statcode            |
+---------+-------------+--------------------------------+---------------------+-------+---------------------+---------------------+
| 1166459 | 15021970243 | 冬天到了【云信测试】           | 2016-11-04 10:33:02 |     1 | 2016-11-04 10:44:21 | 2114782562554393363 |
| 1166461 | 15021970243 | 冬天到了【云信测试】           | 2016-11-04 10:45:53 |    -3 | 2016-11-04 10:46:05 | -3                  |
| 1166463 | 15021970243 | 冬天到了【云信测试】           | 2016-11-04 10:47:42 |    -3 | 2016-11-04 10:47:54 | -3                  |
| 1166465 | 15021970243 | 冬天到了【云信测试】           | 2016-11-04 10:49:08 |    -3 | 2016-11-04 10:49:19 | -3                  |
| 1166467 | 15021970243 | 冬天到了【云信测试】           | 2016-11-04 10:55:33 |     1 | 2016-11-04 10:55:53 | 2114782569505307918 |
| 1166469 | 15021970243 | 冬天到了【云信测试】           | 2016-11-04 11:10:20 |    -3 | 2016-11-04 11:15:17 | -3                  |
| 1166471 | 15021970243 | 冬天到了【云信测试】           | 2016-11-04 11:23:16 |     1 | 2016-11-04 11:23:18 | 2114782586069773509 |
|
+---------+-------------+--------------------------------+---------------------+-------+---------------------+---------------------+

注意:

load  data  infile  默认的列与列间的分隔符是制表符,当出现其他分割符时就会出现加载数据不匹配的情况。

#创建user表   
CREATE TABLE `user` (
  `username` varchar(10) DEFAULT NULL,
  `sex` tinyint(4) DEFAULT NULL,
  `birth` date DEFAULT NULL,
  `address` varchar(50) DEFAULT NULL,
  `phone` varchar(15) DEFAULT NULL,
  `email` varchar(50) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8

#相关的数据(select 或者outfile导出都可以)
winner  1       1993-11-25      甘肃西和县      18393354445     [email protected]
linux   1       1993-11-25      甘肃西和县      18393354445     [email protected]
linux   1       1993-11-27      上海松江        1839335442      [email protected]
linux   1       1993-11-25      甘肃西和县      18393354445     [email protected]
linux   1       1993-11-27      上海松江        1839335442      [email protected]
linux   1       1993-11-27      上海松江        1839335442      [email protected]
linux   1       1993-11-25      甘肃西和县      18393354445     [email protected]
linux   1       1993-11-27      上海松江        1839335442      [email protected]
linux   1       1993-11-27      上海松江        1839335442      [email protected]
linux   1       1993-11-27      上海松江        1839335442      [email protected]
docker  1       1993-11-27      上海松江        1839335442      [email protected]
将分隔符换成逗号","
awk -F"\t"  '{print $1","$2","$3","$4","$5","$6}'  user.txt  >user.awk
或者:sed  "s/\t/,/g"  user.txt >user.txt
winner,1,1993-11-25,甘肃西和县,18393354445,[email protected]
linux,1,1993-11-25,甘肃西和县,18393354445,[email protected]
linux,1,1993-11-27,上海松江,1839335442,[email protected]
linux,1,1993-11-25,甘肃西和县,18393354445,[email protected]
linux,1,1993-11-27,上海松江,1839335442,[email protected]
linux,1,1993-11-27,上海松江,1839335442,[email protected]
linux,1,1993-11-25,甘肃西和县,18393354445,[email protected]
linux,1,1993-11-27,上海松江,1839335442,[email protected]
linux,1,1993-11-27,上海松江,1839335442,[email protected]
linux,1,1993-11-27,上海松江,1839335442,[email protected]
docker,1,1993-11-27,上海松江,1839335442,[email protected]

加载数据:
mysql> LOAD DATA INFILE '/var/lib/mysql/Docker/user.awk' INTO TABLE user;
Query OK, 11 rows affected, 66 warnings (0.05 sec)
Records: 11  Deleted: 0  Skipped: 0  Warnings: 66

mysql> select  * from user;
winner,1,1 | NULL | NULL       | NULL            | NULL        | NULL                |
| linux,1,19 | NULL | NULL       | NULL            | NULL        | NULL                |
| linux,1,19 | NULL | NULL       | NULL            | NULL        | NULL                |
| linux,1,19 | NULL | NULL       | NULL            | NULL        | NULL                |
| linux,1,19 | NULL | NULL       | NULL            | NULL        | NULL                |
| linux,1,19 | NULL | NULL       | NULL            | NULL        | NULL                |
| linux,1,19 | NULL | NULL       | NULL            | NULL        | NULL                |
| linux,1,19 | NULL | NULL       | NULL            | NULL        | NULL                |
| linux,1,19 | NULL | NULL       | NULL            | NULL        | NULL                |
| linux,1,19 | NULL | NULL       | NULL            | NULL        | NULL       
指定分隔符
LOAD DATA INFILE '/var/lib/mysql/Docker/user.awk' INTO TABLE user FIELDS  TERMINATED BY ','
查看插入结果:
 linux,1,19 | NULL | NULL       | NULL            | NULL        | NULL                |
| linux,1,19 | NULL | NULL       | NULL            | NULL        | NULL                |
| linux,1,19 | NULL | NULL       | NULL            | NULL        | NULL                |
| linux,1,19 | NULL | NULL       | NULL            | NULL        | NULL                |
| linux,1,19 | NULL | NULL       | NULL            | NULL        | NULL                |
| linux,1,19 | NULL | NULL       | NULL            | NULL        | NULL                |
| linux,1,19 | NULL | NULL       | NULL            | NULL        | NULL                |
| linux,1,19 | NULL | NULL       | NULL            | NULL        | NULL                |
| linux,1,19 | NULL | NULL       | NULL            | NULL        | NULL                |
| docker,1,1 | NULL | NULL       | NULL            | NULL        | NULL                |
| winner     |    1 | 1993-11-25 | 甘肃西和县      | 18393354445 | [email protected] |
| linux      |    1 | 1993-11-25 | 甘肃西和县      | 18393354445 | [email protected] |
| linux      |    1 | 1993-11-27 | 上海松江        | 1839335442  | [email protected]  |
| linux      |    1 | 1993-11-25 | 甘肃西和县      | 18393354445 | [email protected] |
| linux      |    1 | 1993-11-27 | 上海松江        | 1839335442  | [email protected]  |
| linux      |    1 | 1993-11-27 | 上海松江        | 1839335442  | [email protected]  |
| linux      |    1 | 1993-11-25 | 甘肃西和县      | 18393354445 | [email protected] |
| linux      |    1 | 1993-11-27 | 上海松江        | 1839335442  | [email protected]  |
| linux      |    1 | 1993-11-27 | 上海松江        | 1839335442  | [email protected]  |
| linux      |    1 | 1993-11-27 | 上海松江        | 1839335442  | [email protected]  |
| docker     |    1 | 1993-11-27 | 上海松江        | 1839335442  | [email protected]


方法3、 使用select 导出数据
  mysql  -u  root  -p  -e  "select  *  from wangjubao.send_done;" >/tmp/winner2.sql
检查数据
[root@slave1 tmp]# cat  winner2.sql
id      phone   content intime  state   sendtime        statcode
1166459 15021970243     冬天到了【云信测试】    2016-11-04 10:33:02     1       2016-11-04 10:44:21     2114782562554393363
1166461 15021970243     冬天到了【云信测试】    2016-11-04 10:45:53     -3      2016-11-04 10:46:05     -3
1166463 15021970243     冬天到了【云信测试】    2016-11-04 10:47:42     -3      2016-11-04 10:47:54     -3
1166465 15021970243     冬天到了【云信测试】    2016-11-04 10:49:08     -3      2016-11-04 10:49:19     -3
1166467 15021970243     冬天到了【云信测试】    2016-11-04 10:55:33     1       2016-11-04 10:55:53     2114782569505307918

处理第一行
sed   -i  "1,1d"  /tmp/winner2.sq
处理结果
1166459 15021970243     冬天到了【云信测试】    2016-11-04 10:33:02     1       2016-11-04 10:44:21     2114782562554393363
1166461 15021970243     冬天到了【云信测试】    2016-11-04 10:45:53     -3      2016-11-04 10:46:05     -3
1166463 15021970243     冬天到了【云信测试】    2016-11-04 10:47:42     -3      2016-11-04 10:47:54     -3
1166465 15021970243     冬天到了【云信测试】    2016-11-04 10:49:08     -3      2016-11-04 10:49:19     -3
1166467 15021970243     冬天到了【云信测试】    2016-11-04 10:55:33     1       2016-11-04 10:55:53     2114782569505307918
   使用load加载数据就可以了

方法4、利用CSV存储引擎导入数据

  像nivcate之类的工具,我们都可以导入CSV,excel,txt等格式的数据,在研究完CSV存储引擎后,发现CSV存储引擎,可以直接向CSV文件导入到数据库中,CSV存储引擎的表,会在操作系统上存储.frm表结构定义信息,还有.CSV文件存储数据就是和普通的CSV没什么区别。我们可以手动的更改此文件。从而实现增删改。

实践

需要注意分隔符是英文逗号(,),先创建相关的表以及数据

CREATE TABLE `lvs` (   `id` int(11) NOT NULL,  
 `name` char(20) NOT NULL, 
   `address` char(30) NOT NULL,   
   `mail` char(30) NOT NULL ) ENGINE=CSV DEFAULT CHARSET=utf8;
   
  #数据文件
1,"百度","人工智能","[email protected]"
2,"百度","测试","[email protected]"
3,"腾讯","北京","[email protected]"
4,"阿里巴巴","计算器","[email protected]"
  
 #检查改表相关的物理文件
-rw-rw---- 1 mysql mysql   35 May 17 16:28 lvs.CSM # 报错表的状态和表中的数据
-rw-rw---- 1 mysql mysql    0 May 17 16:28 lvs.CSV #数据文件
-rw-rw---- 1 mysql mysql 8652 May 17 16:28 lvs.frm #表结构

[root@iZ23t094y03Z test]# cat   lvs.csv #检查准备的数据文件
1,"百度","人工智能","[email protected]"
2,"百度","测试","[email protected]"
3,"腾讯","北京","[email protected]"
4,"阿里巴巴","计算器","[email protected]"
1,"百度","人工智能","[email protected]"
2,"百度","测试","[email protected]"
3,"腾讯","北京","[email protected]"
4,"阿里巴巴","计算器","[email protected]"
#将准备好的数据文件写入lvs.CSV文件
root@iZ23t094y03Z test]# cat   lvs.csv   >lvs.CSV 
#检查数据库
MariaDB [test]> select *  from lvs;
+----+--------------+--------------+---------------+
| id | name         | address      | mail          |
+----+--------------+--------------+---------------+
|  1 | 百度         | 人工智能     | [email protected] |
|  2 | 百度         | 测试         | [email protected] |
|  3 | 腾讯         | 北京         | [email protected] |
|  4 | 阿里巴巴     | 计算器       | [email protected] |
|  1 | 百度         | 人工智能     | [email protected] |
|  2 | 百度         | 测试         | [email protected] |
|  3 | 腾讯         | 北京         | [email protected] |
|  4 | 阿里巴巴     | 计算器       | [email protected] |
+----+--------------+--------------+---------------+
再插入
  cat   lvs.csv   >>lvs.CSV  #这时更改数据、增加数据  可能不会立即生效 可以用以下命令
  检查和修复。

 MariaDB [test]> check  table lvs;
+----------+-------+----------+----------+
| Table    | Op    | Msg_type | Msg_text |
+----------+-------+----------+----------+
| test.lvs | check | error    | Corrupt  |
+----------+-------+----------+----------+
1 row in set (0.00 sec)

MariaDB [test]> repair  table   lvs;
+----------+--------+----------+----------+
| Table    | Op     | Msg_type | Msg_text |
+----------+--------+----------+----------+
| test.lvs | repair | status   | OK       |
+----------+--------+----------+----------+
1 row in set (0.00 sec)

MariaDB [test]> select *  from lvs;
+----+--------------+--------------+---------------+
| id | name         | address      | mail          |
+----+--------------+--------------+---------------+
|  1 | 百度         | 人工智能     | [email protected] |
|  2 | 百度         | 测试         | [email protected] |
|  3 | 腾讯         | 北京         | [email protected] |
|  4 | 阿里巴巴     | 计算器       | [email protected] |
|  1 | 百度         | 人工智能     | [email protected] |
|  2 | 百度         | 测试         | [email protected] |
|  3 | 腾讯         | 北京         | [email protected] |
|  4 | 阿里巴巴     | 计算器       | [email protected] |
|  1 | 百度         | 人工智能     | [email protected] |
|  2 | 百度         | 测试         | [email protected] |
|  3 | 腾讯         | 北京         | [email protected] |
|  4 | 阿里巴巴     | 计算器       | [email protected] |
|  1 | 百度         | 人工智能     | [email protected] |
|  2 | 百度         | 测试         | [email protected] |
|  3 | 腾讯         | 北京         | [email protected] |
|  4 | 阿里巴巴     | 计算器       | [email protected] |
+----+--------------+--------------+---------------+
16 rows in set (0.00 sec)

 数据导入的时候需要注意字符集、分割付,中英文标点符号等,不然不能加载数据,check table lvs失败repair  table lvs 修复时, 甚至可能清空整张表的数据。

方法5、复制相同表的数据

  在mysql中我们可以将一张表复制到另一个库中,也可以复制相同的表结构和数据。

1、剪切某表到新的库

目前的test库中有lsv和lvs两张表,还有一个新的库csvtest,目前没有表,我们实现表的移动操作。

MariaDB [test]> show  tables;
+----------------+
| Tables_in_test |
+----------------+
| lsv            |
| lvs            |

MariaDB [test]> alter  table   lvs rename  csvtest.lvs;
Query OK, 0 rows affected (0.00 sec)

MariaDB [test]> show tables;  #执行完
+----------------+
| Tables_in_test |
+----------------+
| lsv            |
+----------------+
检查csvtest库


MariaDB [test]> use  csvtest
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [csvtest]> show tables;
+-------------------+
| Tables_in_csvtest |
+-------------------+
| lvs               |
+-------------------+
1 row in set (0.00 sec)

MariaDB [csvtest]> select  *  from lvs;
+----+--------------+--------------+---------------+
| id | name         | address      | mail          |
+----+--------------+--------------+---------------+
|  1 | 百度         | 人工智能     | [email protected] |
|  2 | 百度         | 测试         | [email protected] |
|  3 | 腾讯         | 北京         | [email protected] |
|  4 | 阿里巴巴     | 计算器       | [email protected] |
|  1 | 百度         | 人工智能     | [email protected] |
|  2 | 百度         | 测试         | [email protected] |
|  3 | 腾讯         | 北京         | [email protected] |
|  4 | 阿里巴巴     | 计算器       | [email protected] |
|  1 | 百度         | 人工智能     | [email protected] |
|  2 | 百度         | 测试         | [email protected] |
|  3 | 腾讯         | 北京         | [email protected] |
|  4 | 阿里巴巴     | 计算器       | [email protected] |
|  1 | 百度         | 人工智能     | [email protected] |
|  2 | 百度         | 测试         | [email protected] |
|  3 | 腾讯         | 北京         | [email protected] |
|  4 | 阿里巴巴     | 计算器       | [email protected] |
+----+--------------+--------------+---------------+
16 rows in set (0.00 sec)
真的全部移动到此啊,我们在检查一下物理文件有什么变化呢

[root@iZ23t094y03Z csvtest]# pwd
/var/lib/mysql/csvtest
[root@iZ23t094y03Z csvtest]# ls 
db.opt  lvs.CSM  lvs.CSV  lvs.frm
#再看看原来的目录
[root@iZ23t094y03Z csvtest]# cd  ../test/
[root@iZ23t094y03Z test]# ll
total 24
-rw-rw---- 1 mysql mysql   35 May 17 15:13 lsv.CSM
-rw-rw---- 1 mysql mysql  159 May 17 15:13 lsv.CSV
-rw-rw---- 1 mysql mysql 8652 May 17 15:03 lsv.frm

 这个SQL真的很强大,在物理上和逻辑上都进行了移动。真心的强大啊。

方法2  创建表(复制表)迁移数据

 除了上面的方法,我们还可以使用创建表的方式复制表结构和表中的数据。

MariaDB [csvtest]> create  table  lvs2   engine=innodb  as select * from  csvtest.lvs;
Query OK, 16 rows affected (0.04 sec)
Records: 16  Duplicates: 0  Warnings: 0

MariaDB [csvtest]> show  tables;
+-------------------+
| Tables_in_csvtest |
+-------------------+
| lvs               |
| lvs2              |
+-------------------+
2 rows in set (0.00 sec)

MariaDB [csvtest]> ;
ERROR: No query specified

MariaDB [csvtest]> select  * from  lvs2;
+----+--------------+--------------+---------------+
| id | name         | address      | mail          |
+----+--------------+--------------+---------------+
|  1 | 百度         | 人工智能     | [email protected] |
|  2 | 百度         | 测试         | [email protected] |
|  3 | 腾讯         | 北京         | [email protected] |
|  4 | 阿里巴巴     | 计算器       | [email protected] |
|  1 | 百度         | 人工智能     | [email protected] |
|  2 | 百度         | 测试         | [email protected] |
|  3 | 腾讯         | 北京         | [email protected] |
|  4 | 阿里巴巴     | 计算器       | [email protected] |
|  1 | 百度         | 人工智能     | [email protected] |
|  2 | 百度         | 测试         | [email protected] |
|  3 | 腾讯         | 北京         | [email protected] |
|  4 | 阿里巴巴     | 计算器       | [email protected] |
|  1 | 百度         | 人工智能     | [email protected] |
|  2 | 百度         | 测试         | [email protected] |
|  3 | 腾讯         | 北京         | [email protected] |
|  4 | 阿里巴巴     | 计算器       | [email protected] |
+----+--------------+--------------+---------------+
16 rows in set (0.00 sec)

mysqlimport 导入导出数据

   导入导出数据的方式特别多,除了我们上述的几种外,还有一个mysqlimport可以将文件导入到数据库中。可以从各种格式的文本文件中加载表。 文本文件名称必须是应该使用的表的名称。如果使用套接字连接到MySQL服务器,则服务器将直接打开并读取文本文件。 在其他情况下,客户端将打开文本文件。 SQL命令“LOAD DATA INFILE”用于导入行。

mysqlimport   -u  root  -p123123  Docker --default-character-set=utf8   --fields-terminated-by=, user.awk  #指定分割符

mysqlimport常用参数

--default-character-set=utf8
-d  --delete 导入数据前 会先删除 会删除表中的所有数据
-f --force  如果遇见错误 仍然要继续执行
-i  --ignore  如果插入记录中发现有重复值 那么这条记录不做处理
-r  --replace  如果插入记录中发现有重复值 则覆盖旧记录
-L  --local   从执行命令客户端读取文件 默认从服务端对应的路径下读取文件
-s --silent  导入数据 不输出操作结果
--ignore-lines=  跳过文件的前多少行
--user-threads=  并行加载数据 多线程 加载数据
--fields-terminated-by=  指定分割符
--fiedes-enclosed-by=  指定用于包括住列值的符号 对于字符列 或者中间包括列分隔符情景比较适用 例如分隔符中为, 内容中有逗号。

其实mysqlimport和load data 原理是一样的,所以支持的参数什么都是一样的,主要的区别就是mysqlimport是一种接口的形式



随着使用MYSQL越来越多,也慢慢的发现了其中很多让人惊讶的地方,功能真的非常的强悍。继续努力吧!