在我们使用数据库的过程中,避免不了备份、恢复、导入、导出数据,方法比较多,根据不同的数据量选择不同的方法,会提高我们的工作效率,
(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越来越多,也慢慢的发现了其中很多让人惊讶的地方,功能真的非常的强悍。继续努力吧!