在我们使用数据库的过程中,避免不了备份、恢复、导入、导出数据,方法比较多,根据不同的数据量选择不同的方法,会提高我们的工作效率,
(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 21147825625543933631166461 15021970243 冬天到了【云信测试】 2016-11-04 10:45:53 -3 2016-11-04 10:46:05 -31166463 15021970243 冬天到了【云信测试】 2016-11-04 10:47:42 -3 2016-11-04 10:47:54 -31166465 15021970243 冬天到了【云信测试】 2016-11-04 10:49:08 -3 2016-11-04 10:49:19 -311: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: 0MariaDB [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 18393355445@163.comlinux 1 1993-11-25 甘肃西和县 18393354445 18393355445@163.comlinux 1 1993-11-27 上海松江 1839335442 1839335544@163.comlinux 1 1993-11-25 甘肃西和县 18393354445 18393355445@163.comlinux 1 1993-11-27 上海松江 1839335442 1839335544@163.comlinux 1 1993-11-27 上海松江 1839335442 1839335544@163.comlinux 1 1993-11-25 甘肃西和县 18393354445 18393355445@163.comlinux 1 1993-11-27 上海松江 1839335442 1839335544@163.comlinux 1 1993-11-27 上海松江 1839335442 1839335544@163.comlinux 1 1993-11-27 上海松江 1839335442 1839335544@163.comdocker 1 1993-11-27 上海松江 1839335442 1839ss5544@163.com将分隔符换成逗号","awk -F"\t" '{print $1","$2","$3","$4","$5","$6}' user.txt >user.awk或者:sed "s/\t/,/g" user.txt >user.txtwinner,1,1993-11-25,甘肃西和县,18393354445,18393355445@163.comlinux,1,1993-11-25,甘肃西和县,18393354445,18393355445@163.comlinux,1,1993-11-27,上海松江,1839335442,1839335544@163.comlinux,1,1993-11-25,甘肃西和县,18393354445,18393355445@163.comlinux,1,1993-11-27,上海松江,1839335442,1839335544@163.comlinux,1,1993-11-27,上海松江,1839335442,1839335544@163.comlinux,1,1993-11-25,甘肃西和县,18393354445,18393355445@163.comlinux,1,1993-11-27,上海松江,1839335442,1839335544@163.comlinux,1,1993-11-27,上海松江,1839335442,1839335544@163.comlinux,1,1993-11-27,上海松江,1839335442,1839335544@163.comdocker,1,1993-11-27,上海松江,1839335442,1839ss5544@163.com加载数据: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: 66mysql> 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 | 18393355445@163.com || linux | 1 | 1993-11-25 | 甘肃西和县 | 18393354445 | 18393355445@163.com || linux | 1 | 1993-11-27 | 上海松江 | 1839335442 | 1839335544@163.com || linux | 1 | 1993-11-25 | 甘肃西和县 | 18393354445 | 18393355445@163.com || linux | 1 | 1993-11-27 | 上海松江 | 1839335442 | 1839335544@163.com || linux | 1 | 1993-11-27 | 上海松江 | 1839335442 | 1839335544@163.com || linux | 1 | 1993-11-25 | 甘肃西和县 | 18393354445 | 18393355445@163.com || linux | 1 | 1993-11-27 | 上海松江 | 1839335442 | 1839335544@163.com || linux | 1 | 1993-11-27 | 上海松江 | 1839335442 | 1839335544@163.com || linux | 1 | 1993-11-27 | 上海松江 | 1839335442 | 1839335544@163.com || docker | 1 | 1993-11-27 | 上海松江 | 1839335442 | 1839ss5544@163.com
方法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 statcode1166459 15021970243 冬天到了【云信测试】 2016-11-04 10:33:02 1 2016-11-04 10:44:21 21147825625543933631166461 15021970243 冬天到了【云信测试】 2016-11-04 10:45:53 -3 2016-11-04 10:46:05 -31166463 15021970243 冬天到了【云信测试】 2016-11-04 10:47:42 -3 2016-11-04 10:47:54 -31166465 15021970243 冬天到了【云信测试】 2016-11-04 10:49:08 -3 2016-11-04 10:49:19 -31166467 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 21147825625543933631166461 15021970243 冬天到了【云信测试】 2016-11-04 10:45:53 -3 2016-11-04 10:46:05 -31166463 15021970243 冬天到了【云信测试】 2016-11-04 10:47:42 -3 2016-11-04 10:47:54 -31166465 15021970243 冬天到了【云信测试】 2016-11-04 10:49:08 -3 2016-11-04 10:49:19 -31166467 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,"百度","人工智能","18655@163.com"2,"百度","测试","18655@163.com"3,"腾讯","北京","18655@163.com"4,"阿里巴巴","计算器","18655@163.com" #检查改表相关的物理文件-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,"百度","人工智能","18655@163.com"2,"百度","测试","18655@163.com"3,"腾讯","北京","18655@163.com"4,"阿里巴巴","计算器","18655@163.com"1,"百度","人工智能","18655@163.com"2,"百度","测试","18655@163.com"3,"腾讯","北京","18655@163.com"4,"阿里巴巴","计算器","18655@163.com"#将准备好的数据文件写入lvs.CSV文件root@iZ23t094y03Z test]# cat lvs.csv >lvs.CSV #检查数据库MariaDB [test]> select * from lvs;+----+--------------+--------------+---------------+| id | name | address | mail |+----+--------------+--------------+---------------+| 1 | 百度 | 人工智能 | 18655@163.com || 2 | 百度 | 测试 | 18655@163.com || 3 | 腾讯 | 北京 | 18655@163.com || 4 | 阿里巴巴 | 计算器 | 18655@163.com || 1 | 百度 | 人工智能 | 18655@163.com || 2 | 百度 | 测试 | 18655@163.com || 3 | 腾讯 | 北京 | 18655@163.com || 4 | 阿里巴巴 | 计算器 | 18655@163.com |+----+--------------+--------------+---------------+再插入 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 | 百度 | 人工智能 | 18655@163.com || 2 | 百度 | 测试 | 18655@163.com || 3 | 腾讯 | 北京 | 18655@163.com || 4 | 阿里巴巴 | 计算器 | 18655@163.com || 1 | 百度 | 人工智能 | 18655@163.com || 2 | 百度 | 测试 | 18655@163.com || 3 | 腾讯 | 北京 | 18655@163.com || 4 | 阿里巴巴 | 计算器 | 18655@163.com || 1 | 百度 | 人工智能 | 18655@163.com || 2 | 百度 | 测试 | 18655@163.com || 3 | 腾讯 | 北京 | 18655@163.com || 4 | 阿里巴巴 | 计算器 | 18655@163.com || 1 | 百度 | 人工智能 | 18655@163.com || 2 | 百度 | 测试 | 18655@163.com || 3 | 腾讯 | 北京 | 18655@163.com || 4 | 阿里巴巴 | 计算器 | 18655@163.com |+----+--------------+--------------+---------------+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 csvtestReading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changedMariaDB [csvtest]> show tables;+-------------------+| Tables_in_csvtest |+-------------------+| lvs |+-------------------+1 row in set (0.00 sec)MariaDB [csvtest]> select * from lvs;+----+--------------+--------------+---------------+| id | name | address | mail |+----+--------------+--------------+---------------+| 1 | 百度 | 人工智能 | 18655@163.com || 2 | 百度 | 测试 | 18655@163.com || 3 | 腾讯 | 北京 | 18655@163.com || 4 | 阿里巴巴 | 计算器 | 18655@163.com || 1 | 百度 | 人工智能 | 18655@163.com || 2 | 百度 | 测试 | 18655@163.com || 3 | 腾讯 | 北京 | 18655@163.com || 4 | 阿里巴巴 | 计算器 | 18655@163.com || 1 | 百度 | 人工智能 | 18655@163.com || 2 | 百度 | 测试 | 18655@163.com || 3 | 腾讯 | 北京 | 18655@163.com || 4 | 阿里巴巴 | 计算器 | 18655@163.com || 1 | 百度 | 人工智能 | 18655@163.com || 2 | 百度 | 测试 | 18655@163.com || 3 | 腾讯 | 北京 | 18655@163.com || 4 | 阿里巴巴 | 计算器 | 18655@163.com |+----+--------------+--------------+---------------+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]# lltotal 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: 0MariaDB [csvtest]> show tables;+-------------------+| Tables_in_csvtest |+-------------------+| lvs || lvs2 |+-------------------+2 rows in set (0.00 sec)MariaDB [csvtest]> ;ERROR: No query specifiedMariaDB [csvtest]> select * from lvs2;+----+--------------+--------------+---------------+| id | name | address | mail |+----+--------------+--------------+---------------+| 1 | 百度 | 人工智能 | 18655@163.com || 2 | 百度 | 测试 | 18655@163.com || 3 | 腾讯 | 北京 | 18655@163.com || 4 | 阿里巴巴 | 计算器 | 18655@163.com || 1 | 百度 | 人工智能 | 18655@163.com || 2 | 百度 | 测试 | 18655@163.com || 3 | 腾讯 | 北京 | 18655@163.com || 4 | 阿里巴巴 | 计算器 | 18655@163.com || 1 | 百度 | 人工智能 | 18655@163.com || 2 | 百度 | 测试 | 18655@163.com || 3 | 腾讯 | 北京 | 18655@163.com || 4 | 阿里巴巴 | 计算器 | 18655@163.com || 1 | 百度 | 人工智能 | 18655@163.com || 2 | 百度 | 测试 | 18655@163.com || 3 | 腾讯 | 北京 | 18655@163.com || 4 | 阿里巴巴 | 计算器 | 18655@163.com |+----+--------------+--------------+---------------+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越来越多,也慢慢的发现了其中很多让人惊讶的地方,功能真的非常的强悍。继续努力吧!