DBA-1-3 数据导入导出

本文详细介绍了MySQL中数据的导入与导出操作。在MySQL 5.7及以上版本,导入数据时文件需位于特定路径下。数据导入涉及创建对应表结构、使用LOAD DATA INFILE命令,并注意字段分隔符和数据类型匹配。通过示例演示了如何导入系统文件到数据库表,以及在导入过程中遇到的问题及解决方案,如调整表结构以避免数据范围错误。此外,还讲解了数据导出,包括使用SELECT INTO OUTFILE命令将查询结果保存到文件,以及自定义字段和行间隔符。

========================================================================
    【【  数据库 03day  】】
数据导入,导出
数据导入:把系统文件的内容存储到数据库的表里。
把文件的内容存储到数据库的表里,对这个文件是有要求的 ,有规律的 有一定的格式。
步骤: 
1.创建一个存储文件内容的表,(这个表 的字段,什么类型的 约束   是根据你要存储数据文件内容的而建的)
2.执行导入数据的sql命令  (格式一定要记住)
3. 在mysql 5.7这个版本的这个软件里面  它在导入数据的时候  它要求系统文件必须在默认的导入数据的路径下才可以,5.7之前的版本是没有这个要求的。
show variables like "secure_file_priv";    (看一下mysql的变量variables 像 。。。。) 

设置搜索路径
• 查看默认使用目录及目录是否存在
mysql> show variables like "secure_file_priv";
+------------------+-----------------------+
| Variable_name    | Value                 |
+------------------+-----------------------+
| secure_file_priv | /var/lib/mysql-files/ |
+------------------+-----------------------+
1 row in set (0.01 sec)

### 如果你想把系统文件 存储到数据库表里;首先你要先把那个文件拷贝到 /var/lib/mysql-files/ 路径下 才可以    默认时候你装软件包的时候,路径已经创建好了!  这个路径目录是可以修改的。
----------------------------
数据导入
• 基本用法
– LOAD DATA INFILE “ 目录名 / 文件名”
INTO TABLE 表名
FIELDS TERMINATED BY “ 分隔符”
LINES TERMINATED BY “\n”;
• 注意事项
– 字段分隔符要与文件内的一致
– 指定导入文件的绝对路径
– 导入数据的表字段类型要与文件字段匹配
– 禁用 SElinux

##  示例演示::--->>   把/etc/passwd  导入到数据库中

1 ##  把需要导入数据库 的文件  拷贝到 指定的路径下!

[root@host50 mysql-files]# ls /etc/passwd
/etc/passwd
[root@host50 mysql-files]# head /etc/passwd     ## 看一下这个文件的规律, 每一行都是7列  都是用: 号分隔的! 每一行就像表中的一条记录。
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@host50 mysql-files]# 
[root@host50 mysql-files]# pwd
/var/lib/mysql-files
[root@host50 mysql-files]# cp /etc/passwd ./    ## 把目标文件拷贝到 该路径下!!

[root@host50 mysql-files]# head -2 passwd    ## 看一下文件内容的格式,及相关的规律!
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@host50 mysql-files]# 

2## 建表!!
mysql> use db1;
Database changed
mysql>                     ##: 根据passwd内容创建一个表
mysql> create table user(
    -> name char(30),
    -> password char(1),
    -> uid smallint(2),
    -> gid smallint(2),
    -> comment char(100),
    -> homedir char(150),
    -> shell char(50),
    -> index(name)
    -> );
Query OK, 0 rows affected (0.39 sec)

mysql> show create table user;            ## 查看一下创建表的内容!
--------------------------------------------------------------------------------
-------------+
| user  | CREATE TABLE `user` (
  `name` char(30) DEFAULT NULL,
  `password` char(1) DEFAULT NULL,
  `uid` smallint(2) DEFAULT NULL,
  `gid` smallint(2) DEFAULT NULL,
  `comment` char(100) DEFAULT NULL,
  `homedir` char(150) DEFAULT NULL,
  `shell` char(50) DEFAULT NULL,
  KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> 
mysql> desc user;                ## 看一下表结构 !
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| name     | char(30)    | YES  | MUL | NULL    |       |
| password | char(1)     | YES  |     | NULL    |       |
| uid      | smallint(2) | YES  |     | NULL    |       |
| gid      | smallint(2) | YES  |     | NULL    |       |
| comment  | char(100)   | YES  |     | NULL    |       |
| homedir  | char(150)   | YES  |     | NULL    |       |
| shell    | char(50)    | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
7 rows in set (0.00 sec)

mysql> 

补充::::::
把目标文件拷贝到 指定的路径下 
[root@host50 mysql-files]# cp /etc/passwd /var/lib/mysql-files/     ## 用系统命令拷贝!

在mysql数据库登录模式下执行系统命令! 在前面加 system     结束的时候不用加;号
mysql> system cp /etc/passwd /var/lib/mysql-files/
mysql> system ls /var/lib/mysql-files/
passwd
----------------
3## 导入  导入    ":" passwd这个文件中每一行中列的间隔符就是冒号     行的间隔符  每一行都有\n换行符。

mysql> load data infile "/var/lib/mysql-files/passwd" into table user fields terminated by ":" lines terminated by "\n";
ERROR 1264 (22003): Out of range value for column 'uid' at row 30    ## 报错 第30行报错!
mysql> 
[root@host50 mysql-files]# sed -n '30p' passwd      ## 看一下 30行
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@host50 mysql-files]# 

mysql> select * from user;      ## 看一下什么也没有导入       此时就应该修改一下user表结构
Empty set (0.00 sec)

————##解决错误   此时就应该修改一下user表结构——————
mysql> desc user;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| name     | char(30)    | YES  | MUL | NULL    |       |
| password | char(1)     | YES  |     | NULL    |       |
| uid      | smallint(2) | YES  |     | NULL    |       |
| gid      | smallint(2) | YES  |     | NULL    |       |
| comment  | char(100)   | YES  |     | NULL    |       |
| homedir  | char(150)   | YES  |     | NULL    |       |
| shell    | char(50)    | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
7 rows in set (0.00 sec)

mysql> alter table user
    -> modify
    -> uid int(2),
    -> modify gid int(2);
Query OK, 0 rows affected (0.40 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc user;
+----------+-----------+------+-----+---------+-------+
| Field    | Type      | Null | Key | Default | Extra |
+----------+-----------+------+-----+---------+-------+
| name     | char(30)  | YES  | MUL | NULL    |       |
| password | char(1)   | YES  |     | NULL    |       |
| uid      | int(2)    | YES  |     | NULL    |       |
| gid      | int(2)    | YES  |     | NULL    |       |
| comment  | char(100) | YES  |     | NULL    |       |
| homedir  | char(150) | YES  |     | NULL    |       |
| shell    | char(50)  | YES  |     | NULL    |       |
+----------+-----------+------+-----+---------+-------+
7 rows in set (0.00 sec)

## 再次导入   成功!!!
mysql> load data infile "/var/lib/mysql-files/passwd" into table user fields terminated by ":" lines terminated by "\n";
Query OK, 41 rows affected (0.04 sec)
Records: 41  Deleted: 0  Skipped: 0  Warnings: 0

mysql> 

[root@host50 mysql-files]# wc -l passwd   ##看一下文件有多少行!
41 passwd

mysql> select * from user;     ##看一下表结构   也是41行!
-----------------------------------+---------------------------+----------------+
41 rows in set (0.00 sec)

4## 添加行号   为了方便管理表 可以添加行号!!
mysql> alter table user
    -> add
    -> id int(2) primary key      ##行号字段 一般叫id  int数值类型的,宽度是2   设为主键
    -> auto_increment            ## 自增长
    -> first;                ## 放在所有字段前面!

mysql> select * from user;           ## 查看 可以看到每一行前面都有行号!

## 为什么不刚开始建表的时候就添加行号字段;  不可以 不可以   因为导入数据的时候,源文件内容没有行号,是根据文件内容建表的, 必须导入数据之后才添加行号的!!

## 精确查看!! 添加行号方便管理!
mysql> select * from user where id=15;    ##看一下第15行
mysql> select * from user where id<=3;    ## 看一下前三行
-----------------
设置搜索路径(续 1 )
• 修改目录及查看修改结果   (可以不用修改!)
##  默认导入数据的时候 是指定的路径搜索文件的目录。 也可以根据自己 自定义导入文件的时候  文件的存储路径! 
mysql> show variables like "secure_file_priv";
+------------------+-----------------------+
| Variable_name    | Value                 |
+------------------+-----------------------+
| secure_file_priv | /var/lib/mysql-files/ |
+------------------+-----------------------+
1 row in set (0.00 sec)

mysql> 

[root@host50 ~]# vim /etc/my.cnf

[mysqld]
validate_password_policy=0
validate_password_length=6
secure_file_priv="/dirdata"         ## 自定义存储路径
#
:wq
[root@host50 ~]# mkdir /dirdata    ## 系统中要建立相应的文件夹路径!
[root@host50 ~]# 
[root@host50 ~]# chown mysql /dirdata   ## 更改文件夹的所有者!
[root@host50 ~]# getenforce 
Permissive
[root@host50 ~]# systemctl stop mysqld
[root@host50 ~]# systemctl start mysqld
[root@host50 ~]# cp /etc/passwd /dirdata/
[root@host50 ~]# cd /dirdata/
[root@host50 dirdata]# ls
passwd
[root@host50 dirdata]# 

mysql> load data infile "/dirdata/passwd" into table user fields terminated by ":" lines terminated by "\n";
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    3
Current database: db1

ERROR 1366 (HY000): Incorrect integer value: 'root' for column 'id' at row 1     ##报错! 第一行行号字段,字符与数据类型不符
mysql> 

## 把第一行  行号字段删除!!
mysql> alter table user drop id;
Query OK, 41 rows affected (0.72 sec)
Records: 41  Duplicates: 0  Warnings: 0

## 重新导入数据(只要导入的数据和表结构不冲突,你想导几次就导几次)
mysql> load data infile "/dirdata/passwd" into table user fields terminated by ":" lines terminated by "\n";
Query OK, 41 rows affected (0.11 sec)
Records: 41  Deleted: 0  Skipped: 0  Warnings: 0

mysql> 

mysql> select * from user;
。。。。。。
-----------------------------------+---------------------------+----------------+
82 rows in set (0.00 sec)

## 再添加行号
mysql> alter table user add id int(2) primary key auto_increment first;
mysql> select * from user;
------------------------------------------------------
##### 生产环境中 什么时候需要数据导入
想批量把数据存储导数据库中的用的时候
注意:你要导入的文件的内容,必须是有规律的,如果杂乱无章 是无法导入的。

++++++++++++++ 数据导出 +++++++++++++++
++++++++++++++ 数据导出 +++++++++++++++

导出:: 表记录存储到系统文件里  
什么是表记录   就是表中的一行一行的数据,不包括字段名的。字段名是无法导出的
sql 查询       你查询到什么结果 就把什么存储到系统文件里,默认你查询的结果是输出到屏幕上的。
如果不想输出到屏幕上
那么--->
sql 查询 into  outfile  “目录/ 文件名”      (这个目录就是系统指定的目录。 就是看 secure_file_priv=后面跟的路径  “文件名”是导出自定义的,不用事先建立)
mysql> show variables like "secure_file_priv";
+------------------+-----------+
| Variable_name    | Value     |
+------------------+-----------+
| secure_file_priv | /dirdata/ |
+------------------+-----------+
1 row in set (0.00 sec)

mysql> 
 如果更改了就通过[ root@host50 ~]# head /etc/my.cnf 查看路径!

@@## 导出什么内容 取决于你查询的结果!
---------------

• 基本用法
– SELECT 查询 .. ..
INTO OUTFILE “ 目录名 / 文件名”
FIELDS TERMINATED BY “ 分隔符”
LINES TERMINATED BY “\n”;
• 注意事项
– 导出的内容由 SQL 查询语句决定
– 禁用 SElinux

示例演示01::--->>>> 把库db1中user表中的数据全部 导出,保存到系统中 命名为user1.txt。
mysql> select database();
+------------+
| database() |
+------------+
| db1        |
+------------+
1 row in set (0.00 sec)

mysql> select * from user
    -> into outfile
    -> "/dirdata/user1.txt";
Query OK, 82 rows affected (0.00 sec)

mysql> 
查询结果;;
[root@host50 ~]# cd /dirdata/
[root@host50 dirdata]# ls
passwd  user1.txt
[root@host50 dirdata]# ll user1.txt 
-rw-rw-rw-. 1 mysql mysql 4461 8月  23 14:46 user1.txt
[root@host50 dirdata]# vim user1.txt 

示例演示02::--->>>> 把库db1中user表中的id,name,password这三列的数据 导出,保存到系统中 命名为user2.txt。
mysql> select id,name,password from user into outfile  "/dirdata/user1.txt";
ERROR 1086 (HY000): File '/dirdata/user1.txt' already exists                ## user1.txt 已经存在了。
mysql> 
mysql> 
mysql> select id,name,password from user into outfile  "/dirdata/user2.txt";
Query OK, 82 rows affected (0.01 sec)

[root@host50 dirdata]# ls
passwd  user1.txt  user2.txt  
[root@host50 dirdata]# 


[root@host50 dirdata]# cat user2.txt 
1    root    x
2    bin    x
3    daemon    x
4    adm    x
5    lp    x
6    sync    x
7    shutdown    x
.....   ....   

示例演示03::--->>>> 把库db1中user表中的id,name,password这三列的数据前三行 导出,保存到系统中 命名为user3.txt。

mysql> select id,name,password from user where id <=3 into outfile  "/dirdata/user3.txt";
Query OK, 3 rows affected (0.00 sec)

mysql> 

[root@host50 dirdata]# ls
passwd  user1.txt  user2.txt  user3.txt
[root@host50 dirdata]# cat user3.txt
1       root    x
2       bin     x
3       daemon  x
~                                                                                          
~                 
数据导出的时候, 默认 字段的间隔符 往文件里面存的时候是一个Tab键的距离;默认 记录的(行的)间隔符是换行符号。如user3.txt

可以自定义 字段的间隔符,记录的间隔符。

示例演示:: --->> 指定字段的间隔符 为 ### 
mysql> select id,name,password from user into outfile  "/dirdata/user4.txt"
    -> fields terminated by "###";
Query OK, 82 rows affected (0.00 sec)

mysql> 
[root@host50 dirdata]# vim user4.txt  
1###root###x
2###bin###x
3###daemon###x
4###adm###x
5###lp###x
6###sync###x
7###shutdown###x

示例演示:: --->> 指定字段的间隔符 为 ###  记录(行的)的间隔符号为!!!
mysql> select id,name,password from user where id <=3 into outfile  "/dirdata/user5.txt"
    -> fields terminated by ";"
    -> lines terminated by "!!!";
Query OK, 3 rows affected (0.01 sec)

[root@host50 dirdata]# ls
passwd  user1.txt  user2.txt  user3.txt  user4.txt  user5.txt

[root@host50 dirdata]# vim user5.txt 
1;root;x!!!2;bin;x!!!3;daemon;x!!!


## 什么时候需要把数据导出!!
我想把表里面的数据打印一份  这时候就需要把数据到出到一个文件里 才能打印。 就是需要批量数据库里面的数据的时候
---------------------------------------------------------------
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值