8310 字
42 分钟
07 mysql之数据导入导出与用户管理

[TOC]

07 mysql之数据导入导出与用户管理#

今天工作任务路线图

flowchart LR
subgraph BottomRow[数据导入导出与用户管理]
direction LR
A[数据导入导出] --> B[用户管理]
end
classDef highlight stroke:#f00,stroke-width:2px;
class E highlight;

一、工作场景#

小李是一家电商公司的数据库管理员。最近公司要对业务系统进行升级,需要将旧数据库中的商品信息、订单记录等数据迁移到新数据库,这就需要他运用数据导出与导入功能。小李使用 SELECT【涩莱克特】 ... INTO【因兔】 OUTFILE【奥特-伐尔】 语句把旧数据库的数据导出到文件,再用 LOAD【漏德】 DATA INFILE【因-伐尔】 语句将数据导入新数据库,保证数据完整迁移。

同时,公司业务拓展后新成立了营销和客服部门,需要为这些新员工创建数据库账户。小李使用 CREATE【克瑞特】 USER 语句创建用户,用 grant【古亮普】 语句根据岗位需求赋予不同权限,确保数据的安全性和员工操作的规范性。

二、为什么学呢#

学习 MySQL 数据导入导出与用户管理具有很强的现实意义。在数据迁移场景中,当公司更换数据库系统或升级服务器时,掌握数据导入导出技能,能确保数据完整、准确地从旧环境过渡到新环境,避免业务中断。比如电商平台促销活动前后,要灵活调整数据存储。

在数据共享方面,可与合作伙伴安全、高效地交换数据。而用户管理是数据库安全的关键,合理设置用户权限,能防止未经授权的访问和数据泄露,保护公司核心数据。掌握这些技能,可提升数据库管理能力,为企业的稳定运行保驾护航,也增强个人在职场上的竞争力。

三、数据导入导出#

当前任务环节

flowchart LR
subgraph BottomRow[数据导入导出与用户管理]
direction LR
A[数据导入导出] --> B[用户管理]
end
classDef highlight stroke:#f00,stroke-width:2px;
class A highlight;

secure【瑟Q儿】_file【伐尔】_priv【破略夫】 是 MySQL 中的一个系统变量,主要用于控制数据导入和导出操作的安全性。下面为你详细介绍:

作用

它限定了 MySQL 服务器在执行数据导入(LOAD【漏德】 DATA INFILE【因-伐尔】)和导出(SELECT【涩莱克特】 ... INTO【因兔】 OUTFILE【奥特-伐尔】)操作时,可以访问的文件路径。通过设置该变量,可以防止 MySQL 服务器随意访问系统上的文件,从而增强系统的安全性,避免潜在的文件访问风险。

查看与修改

  • 查看:可以使用 SHOW【瘦】 VARIABLES【wèi 利 bóu 斯】 LIKE【赖特】 'secure【瑟Q儿】_file【伐尔】_priv【破略夫】'; 语句查看当前 secure【瑟Q儿】_file【伐尔】_priv【破略夫】 的值。
  • 修改:要修改该变量的值,需要编辑 MySQL 的配置文件,在其中添加或修改 secure【瑟Q儿】_file【伐尔】_priv【破略夫】 参数,然后重启 MySQL 服务器使修改生效。

3.1 修改文件存储路径#

修改检索目录为/myload【my漏德】。

检查目录存放导入导出数据时存放数据的文件

[root@mysql50 ~]# mysql -uroot -pNSD123456...a
mysql> show【瘦】 variables【wèi 利 bóu 斯】 like【赖特】 "%file【伐尔】%"; -- 查看与文件相关的配置项
-- mysql> show variables like "%file%";
+---------------------------------------+---------------------------------+
| Variable_name | Value |
+---------------------------------------+---------------------------------+
| character_set_filesystem | binary |
| core_file | OFF |
| ft_stopword_file | (built-in) |
| general_log_file | /var/lib/mysql/mysql50.log |
| init_file | |
| innodb_buffer_pool_filename | ib_buffer_pool |
| innodb_buffer_pool_in_core_file | ON |
| innodb_data_file_path | ibdata1:12M:autoextend |
| innodb_disable_sort_file_cache | OFF |
| innodb_doublewrite_files | 2 |
| innodb_file_per_table | ON |
| innodb_log_file_size | 50331648 |
| innodb_log_files_in_group | 2 |
| innodb_open_files | 4000 |
| innodb_temp_data_file_path | ibtmp1:12M:autoextend |
| keep_files_on_create | OFF |
| large_files_support | ON |
| local_infile | OFF |
| lower_case_file_system | OFF |
| myisam_max_sort_file_size | 9223372036853727232 |
| open_files_limit | 10000 |
| performance_schema_max_file_classes | 80 |
| performance_schema_max_file_handles | 32768 |
| performance_schema_max_file_instances | -1 |
| pid_file | /run/mysqld/mysqld.pid |
| relay_log_info_file | relay-log.info |
| secure_file_priv | /var/lib/mysql-files/ |
| slow_query_log_file | /var/lib/mysql/mysql50-slow.log |
+---------------------------------------+---------------------------------+
28 rows in set (0.00 sec)
-- 查看默认检索目录
mysql> show【瘦】 variables【wèi 利 bóu 斯】 like【赖特】 "secure【瑟Q儿】_file【伐尔】_priv【破略夫】";
-- 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> exit【诶西特】
-- 安装MySQL服务软件时自动创建
[root@mysql50 ~]# ls -ld /var/lib/mysql-files【伐尔】/
-- [root@mha ~]# ls -ld /var/lib/mysql-files/
drwxr-x--- 2 mysql mysql 6 Sep 22 2021 /var/lib/mysql-files【伐尔】/
-- 修改主配置文件
[root@mysql50 ~]# vim /etc/my.cnf.d/mysql-server.cnf
[mysqld]
secure【瑟Q儿】_file【伐尔】_priv【破略夫】=/myload【my漏德】 -- 添加此行
:wq
-- 创建目录并修改所有者为mysql用户 ,并保证mysql用户对父目录有rx
[root@mysql50 ~]# mkdir /myload【my漏德】
-- [root@mha ~]# mkdir /myload
[root@mysql50 ~]# chown【吃-昂】 mysql /myload【my漏德】
-- [root@mha ~]# chown mysql /myload
-- 关闭selinux
[root@mysql50 ~]# setenforce【赛特-因佛尔斯】 0
-- [root@mha ~]# setenforce 0
setenforce: SELinux is disabled
-- 重启服务
[root@mysql50 ~]# systemctl【西斯屯-ctl】 restart【 率 s 达r】 mysqld
-- [root@mha ~]# systemctl restart mysqld
-- 管理员员登陆查看目录
[root@mysql50 ~]# mysql -uroot -pNSD123456...a
mysql> show【瘦】 variables【wèi 利 bóu 斯】 like【赖特】 "secure【瑟Q儿】_file【伐尔】_priv【破略夫】";
-- mysql> show variables like "secure_file_priv";
+------------------+----------+
| Variable_name | Value |
+------------------+----------+
| secure_file_priv | /myload/ |
+------------------+----------+
1 row in set (0.01 sec)

3.2 导入数据#

将/etc/passwd文件导入db1库的user3表里。

命令操作如下所示:

[root@mysql50 ~]# mysql -uroot -pNSD123456...a
mysql> create【克瑞特】 database【得塔-贝斯】 db1;
-- mysql> create database db1;
-- Query OK, 1 row affected (0.01 sec)
-- 建表( 根据导入的文件内容 创建表头)
mysql> create【克瑞特】 table【忒-部】 db1.user3(
name varchar【瓦儿-查儿】(30),
password【帕斯沃德】 char【查尔】(1),
uid int【因特】 ,
gid int【因特】 ,
comment【坑门特】 varchar【瓦儿-查儿】(200),
homedir【home-跌儿】 varchar【瓦儿-查儿】(50),
shell varchar【瓦儿-查儿】(30));
Query OK, 0 rows affected (0.41 sec)
-- mysql> create table db1.user3(
-- name varchar(30),
-- password char(1),
-- uid int,
-- gid int,
-- comment varchar(200),
-- homedir varchar(50),
-- shell varchar(30));
-- Query OK, 0 rows affected (0.06 sec)
-- 查看表头
mysql> desc db1.user3;
-- mysql> desc db1.user3;
+----------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+-------+
| name | varchar(30) | YES | | NULL | |
| password | char(1) | YES | | NULL | |
| uid | int | YES | | NULL | |
| gid | int | YES | | NULL | |
| comment | varchar(200) | YES | | NULL | |
| homedir | varchar(50) | YES | | NULL | |
| shell | varchar(30) | YES | | NULL | |
+----------+--------------+------+-----+---------+-------+
7 rows in set (0.01 sec)
-- 没有数据
mysql> select【涩莱克特】 * from【弗乱】 db1.user3;
-- mysql> select * from db1.user3;
Empty set (0.01 sec)
-- 拷贝文件到检索目录 system【西斯屯】 在MySQL 里执行系统命令
mysql> system【西斯屯】 cp /etc/passwd /myload【my漏德】/
-- mysql> system cp /etc/passwd /myload
-- mysql>
-- mysql> system cp /etc/passwd /myload
-- cp: cannot stat '/etc/passwd': No such file or directory -- 提示该报错是因为一、没有权限,需要修改权限,二、没有文件,需要拷贝文件,三、当前登录的mysql账号没有权限,需要修改权限
-- 一、修改权限
-- mysql> system【西斯屯】 chmod【吃-默德】 777 /myload【my漏德】/
-- mysql> system chmod 777 /myload
-- 三、修改mysql用户权限
-- mysql> grant【格拉特】 all【阿尔】 on /myload【my漏德】/* to【托 敏 内提】 mysql@'%'【托 敏 内提】;
-- mysql> grant all on /myload/* to mysql@'%';
-- 或者切换有权限用户
-- mysql> system whoami --查看当前登录用户
-- sf\ta206682
mysql> system【西斯屯】 ls /myload【my漏德】/ -- 查看文件
-- mysql> system ls /myload
passwd
mysql>
-- 导入数据
mysql> load【漏德】 data infile【因-伐尔】 "/myload【my漏德】/passwd" into【因兔】 table【忒-部】 db1.user3 fields【菲尔兹】 terminated【托 敏 内提】 by【拜】 ":" lines【赖嗯 s】 terminated【托 敏 内提】 by【拜】 "\n" ;
-- mysql> load data infile "/myload/passwd" into table db1.user3 fields terminated by ":" lines terminated by "\n";
Query OK, 23 rows affected (0.06 sec)
Records: 23 Deleted: 0 Skipped: 0 Warnings: 0
-- 查看表记录
mysql> select【涩莱克特】 count【kàn特】(*) from【弗乱】 db1.user3;
-- mysql> select count(*) from db1.user3;
+----------+
| count(*) |
+----------+
| 23 |
+----------+
1 row in set (0.00 sec)
mysql> select【涩莱克特】 * from【弗乱】 db1.user3;
-- mysql> select * from db1.user3;
+------------------+----------+-------+-------+-----------------------------+-----------------+----------------+
| name | password | uid | gid | comment | homedir | shell |
+------------------+----------+-------+-------+-----------------------------+-----------------+----------------+
| 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 |
| games | x | 12 | 100 | games | /usr/games | /sbin/nologin |
| ftp | x | 14 | 50 | FTP User | /var/ftp | /sbin/nologin |
| nobody | x | 65534 | 65534 | Kernel Overflow User | / | /sbin/nologin |
| dbus | x | 81 | 81 | System message bus | / | /sbin/nologin |
| systemd-coredump | x | 999 | 997 | systemd Core Dumper | / | /sbin/nologin |
| systemd-resolve | x | 193 | 193 | systemd Resolver | / | /sbin/nologin |
| polkitd | x | 998 | 995 | User for polkitd | / | /sbin/nologin |
| unbound | x | 997 | 994 | Unbound DNS resolver | /etc/unbound | /sbin/nologin |
| tss | x | 59 | 59 | Account used for TPM access | /dev/null | /sbin/nologin |
| chrony | x | 996 | 993 | | /var/lib/chrony | /sbin/nologin |
| sshd | x | 74 | 74 | Privilege-separated SSH | /var/empty/sshd | /sbin/nologin |
| tcpdump | x | 72 | 72 | | / | /sbin/nologin |
| mysql | x | 27 | 27 | MySQL Server | /var/lib/mysql | /sbin/nologin |
+------------------+----------+-------+-------+-----------------------------+-----------------+----------------+
23 rows in set (0.00 sec)
mysql>

3.3 导出数据#

将db1库user3表所有记录导出, 存到/myload【my漏德】/user.txt文件里。

命令操作如下所示:

mysql> select【涩莱克特】 * from【弗乱】 db1.user3 into【因兔】 outfile【奥特-伐尔】 "/myload【my漏德】/user.txt" ;
-- mysql> select * from db1.user3 into outfile "/myload/user.txt";
Query OK, 23 rows affected (0.00 sec)
mysql> system【西斯屯】 ls /myload【my漏德】/
-- mysql> system ls /myload/
passwd user.txt
mysql> system【西斯屯】 wc -l /myload【my漏德】/user.txt
-- mysql> system wc -l /myload/user.txt
23 /myload/user.txt
mysql>
mysql> system【西斯屯】 vim /myload【my漏德】/user.txt
-- mysql> system vim /myload/user.txt
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
games x 12 100 games /usr/games /sbin/nologin
ftp x 14 50 FTP User /var/ftp /sbin/nologin
nobody x 65534 65534 Kernel Overflow User / /sbin/nologin
dbus x 81 81 System message bus / /sbin/nologin
systemd-coredump x 999 997 systemd Core Dumper / /sbin/nologin
systemd-resolve x 193 193 systemd Resolver / /sbin/nologin
polkitd x 998 995 User for polkitd / /sbin/nologin
unbound x 997 994 Unbound DNS resolver /etc/unbound /sbin/nologin
tss x 59 59 Account used for TPM access /dev/null /sbin/nologin
chrony x 996 993 /var/lib/chrony /sbin/nologin
sshd x 74 74 Privilege-separated SSH /var/empty/sshd /sbin/nologin
tcpdump x 72 72 / /sbin/nologin
mysql x 27 27 MySQL Server /var/lib/mysql /sbin/nologin

四、用户管理#

当前任务环节

flowchart LR
subgraph BottomRow[数据导入导出与用户管理]
direction LR
A[数据导入导出] --> B[用户管理]
end
classDef highlight stroke:#f00,stroke-width:2px;
class B highlight;

4.1 问题#

  1. 允许所有主机使用root连接数据库服务,对所有库和所有表有完全权限、密码为123qqq…A
  2. 允许192.168.90.0/24网段主机使用jam连接数据库服务,仅对gamedb库有完全权限、密码为moershi
  3. 允许在本机使用jamadmin用户连接数据库服务器,仅对moershi库有查询、插入、更新、删除记录的权限,密码为NSD123456…a
  4. 允许192.168.90.51主机使用yaya用户连接数据库服务,仅对moershi库有查询权限,密码为moershi1
  5. 给yaya用户追加,插入记录的权限
  6. 撤销jam用户删库、删表、删记录的权限
  7. 删除jamadmin用户

4.2 方案#

授权是在数据库服务器里添加用户并设置权限及密码;重复执行grant【古亮普】命令时如果库名和用户名不变时,是追加权限。授权步骤如下:

授权信息保存在mysql库的如下表里:

  • user表 保存已有的授权用户及用户对所有库的权限
  • db表 保存已有授权用户对某一个库的访问权限
  • tables【忒-部s】_priv【破略夫】表 记录已有授权用户对某一张表的访问权限
  • columns【科勒姆 s】_priv【破略夫】表 记录已有授权用户对某一个表头的访问权限

在192.168.90.50 数据库服务器练习用户授权

在192.168.90.51 数据库服务器测试

通过模板机克隆一台机器,修改主机名和IP地址

Terminal window
[root@localhost ~]# nmcli connection【肯耐申】 modify【莫迪fái】 ens160 ipv4.addresses【额拽西斯】 192.168.90.51/24 autoconnect【奥特欧 坑聂特】 yes
#[root@mha ~]# nmcli connection modify ens160 ipv4.addresses 192.168.90.51/24 autoconnect yes
[root@localhost ~]# nmcli connection【肯耐申】 up ens160
#[root@mha ~]# nmcli connection up ens160
[root@mysql51 ~]# hostnamectl【厚斯内姆 ctl】 set-hostname【赛特-厚斯内姆】 mysql51
#[root@mha ~]# hostnamectl set-hostname mysql51

安装mysql-server服务软件

Terminal window
[root@mysql51 ~]# yum -y install【因-斯多】 mysql-server【涩·沃】
#[root@mysql51 ~]# yum -y install mysql-server
#启动服务
[root@mysql51 ~]# systemctl【西斯屯-ctl】 start【s 达儿】 mysqld
#[root@mysql51 ~]# systemctl start mysqld
#设置开机自启
[root@mysql51 ~]# systemctl【西斯屯-ctl】 enable【ing 内 步】 mysqld
#[root@mysql51 ~]# systemctl enable mysqld

4.3 步骤#

实现此案例需要按照如下步骤进行。

步骤一:在192.168.90.50 数据库服务器做如下授权练习#

命令操作如下所示:

-- 数据库管理员登陆
[root@mysql51 ~]# mysql -uroot -pNSD123456...a
1)允许所有主机使用root连接数据库服务,对所有库和所有表有完全权限、密码为123qqq…A#
mysql> create【克瑞特】 user root@"%" identified【爱--提伐】 by【拜】 "123qqq...A"; -- 创建用户
-- mysql> create user root@"%" identified by "123qqq...A";
Query OK, 0 rows affected (0.08 sec)
mysql> grant【古亮普】 all【ò】 on【昂】 *.* to root@"%" ; -- 授予权限
-- mysql> grant all on *.* to root@"%";
Query OK, 0 rows affected (0.13 sec)

在 MySQL 中,使用 GRANT 语句来分配权限。其核心语法结构如下:

GRANT 权限列表 ON 数据库对象 TO '用户名'@'主机名' [IDENTIFIED BY '密码'];
权限类别具体权限说明
数据定义 (DDL)CREATE, ALTER, INDEX, REFERENCES允许创建、修改、删除表;创建和删除索引;创建外键 。
数据操作 (DML)SELECT, INSERT, UPDATE允许对数据进行查询、插入和更新 。注意:输出中不包含 DELETE 权限,因此该用户不能删除数据行。
存储程序与高级对象CREATE ROUTINE, ALTER ROUTINE, EXECUTE, EVENT, TRIGGER允许创建、修改和执行存储过程和函数;创建和管理事件(定时任务);创建和管理触发器 。
视图管理CREATE VIEW, SHOW VIEW允许创建和查看视图的定义 。
其他操作CREATE TEMPORARY TABLES, LOCK TABLES允许在操作时创建临时表,并显式锁定表 。
基本连接USAGE仅表示该用户账户存在,并允许其连接数据库。默认情况下,此权限不授予任何数据库操作权限 。
  • 权限列表:指定要授予的具体操作权限。对于记录的增删改查,主要涉及以下四种: - SELECT:允许查询(检索)数据。 - INSERT:允许插入(添加)新记录。 - UPDATE:允许更新(修改)现有记录。 - DELETE:允许删除记录。

  • 数据库对象:定义权限的作用范围,使用 数据库名.表名 的格式指定。 - mydb.mytable:授权针对 mydb 数据库下的 mytable 表。 - mydb.*:授权针对 mydb 数据库下的所有表(这是最常用的场景)。 - *.*:授权针对服务器上所有数据库的所有表(通常仅限管理员用户)。

  • 用户与主机:指定被授权的用户及其允许连接的主机,格式为 '用户名'@'主机名'。 - 'user1'@'localhost':仅允许用户 user1 从数据库服务器本机连接。 - 'user1'@'%':允许用户 user1 从任何远程主机连接。% 在这里是一个通配符。

  • 密码设置(可选):在 GRANT 语句中直接指定或修改用户的密码。更推荐的做法是先使用 CREATE USER 语句明确创建用户。

  1. 授予特定数据库的所有表权限 假设想让用户 report_user 可以从任何主机连接,并拥有对数据库 samp_db 中所有表进行增删改查的权限,可以使用以下命令: sql GRANT SELECT, INSERT, UPDATE, DELETE ON samp_db.* TO 'report_user'@'%';

  2. 创建用户并授权(完整步骤) 这是一个更清晰、安全的做法,将创建用户和授权分步进行: sql -- 1. 创建用户 CREATE USER 'dev_user'@'localhost' IDENTIFIED BY 'secure_password'; -- 2. 授予特定权限(例如,对test_db数据库的所有表) GRANT SELECT, INSERT, UPDATE, DELETE ON test_db.* TO 'dev_user'@'localhost'; -- 3. 使权限设置立即生效 FLUSH PRIVILEGES; 执行 FLUSH PRIVILEGES; 命令是为了让服务器重新加载权限表,确保新的权限设置立即生效。

  3. 查看用户权限 授权完成后,可以验证权限是否已正确分配: sql SHOW GRANTS FOR 'dev_user'@'localhost';

  4. 撤销权限 如果需要收回某些权限,可以使用 REVOKE【瑞 - 沃克】 语句。例如,撤销 dev_usertest_db 的删除权限: sql REVOKE【瑞 - 沃克】 DELETE ON test_db.* FROM 'dev_user'@'localhost'; FLUSH PRIVILEGES;

2)允许192.168.90.0/24网段主机使用jam连接数据库服务,仅对gamedb库有完全权限、密码为moershi#
mysql> create【克瑞特】 user jam@"192.168.90.0/24" identified【爱--提伐】 by【拜】 "moershi"; -- 创建用户
-- mysql> create user jam@"192.168.88.0/24" identified by "moershi";
Query OK, 0 rows affected (0.06 sec)
mysql> grant【古亮普】 all【ò】 on【昂】 gamedb.* to jam@"192.168.90.0/24"; -- 授予权限
-- mysql> grant all on gamedb.* to jam@"192.168.88.0/24";
Query OK, 0 rows affected (0.05 sec)
3)允许在本机使用jamadmin用户连接数据库服务器,仅对moershi库有查询、插入、更新、删除记录的权限,密码为NSD123456…a#
mysql> create【克瑞特】 user jamadmin@"localhost" identified【爱--提伐】 by【拜】 "NSD123456...a"; -- 创建用户
-- mysql> create user jamadmin@"localhost" identified by "NSD123456...a";
Query OK, 0 rows affected (0.05 sec)
mysql> grant【古亮普】 select【涩莱克特】 , insert【因涩特】 , update【阿普 dei 特】,delete【迪 利 特】 on【昂】 moershi.* to jamadmin@"localhost"; -- 授予权限
-- mysql> grant select,insert,update,delete on moershi.* to jamadmin@"localhost";
Query OK, 0 rows affected (0.06 sec)
4)允许192.168.90.51主机使用yaya用户连接数据库服务,仅对moershi库有查询权限,密码为moershi1#
mysql> create【克瑞特】 user yaya@"192.168.90.51" identified【爱--提伐】 by【拜】 "moershi1" ; -- 创建用户
-- mysql> create user yaya@"192.168.88.40" identified by "moershi";
Query OK, 0 rows affected (0.10 sec)
mysql> grant【古亮普】 select【涩莱克特】 on【昂】 moershi.* to yaya@"192.168.90.51"; -- 授予权限
-- mysql> grant select on moershi.* to yaya@"192.168.88.40";
Query OK, 0 rows affected (0.07 sec)
5)给yaya用户追加,插入记录的权限#
mysql> grant【古亮普】 insert【因涩特】 on【昂】 moershi.* to yaya@"192.168.90.51";
-- mysql> grant insert on moershi.* to yaya@"192.168.88.40";
Query OK, 0 rows affected (0.05 sec)
6)查看添加的用户#
-- 添加的用户保存在 mysql库的user表里
mysql> select【涩莱克特】 host,user from【弗乱】 mysql.user;
-- mysql> select user,host from mysql.user;
+-----------------+------------------+
| host | user |
+-----------------+------------------+
| % | root |
| 192.168.90.0/24 | jam |
| 192.168.90.51 | yaya |
| localhost | mysql.infoschema |
| localhost | mysql.session |
| localhost | mysql.sys |
| localhost | jamadmin |
| localhost | root |
+-----------------+------------------+
8 rows in set (0.00 sec)
-- 查看已有用户的访问权限
mysql> show【瘦】 grants【哥亮特s】 for【fò】 yaya@"192.168.90.51";
-- mysql> show grants for yaya@"192.168.88.40";
-- +---------------------------------------------------------------+
-- | Grants for yaya@192.168.88.40 |
-- +---------------------------------------------------------------+
-- | GRANT USAGE ON *.* TO 'yaya'@'192.168.88.40' |
-- | GRANT SELECT, INSERT ON `moershi`.* TO 'yaya'@'192.168.88.40' |
-- +---------------------------------------------------------------+
-- 2 rows in set (0.00 sec)
-- 用户对某一个库的访问权限保存在mysql库的db表里
mysql> select【涩莱克特】 * from【弗乱】 mysql.db where【威尔】 db="moershi" and user="yaya" \G
-- mysql> select * from mysql.db where db="moershi" and user="yaya" \G
*************************** 1. row ***************************
Host: 192.168.88.40
Db: moershi
User: yaya
Select_priv: Y
Insert_priv: Y
Update_priv: N
Delete_priv: N
Create_priv: N
Drop_priv: N
Grant_priv: N
References_priv: N
Index_priv: N
Alter_priv: N
Create_tmp_table_priv: N
Lock_tables_priv: N
Create_view_priv: N
Show_view_priv: N
Create_routine_priv: N
Alter_routine_priv: N
Execute_priv: N
Event_priv: N
Trigger_priv: N
1 row in set (0.00 sec)
mysql>
7)撤销jam用户删库、删表、删记录的权限#
-- 先查看jam用户的权限
-- mysql> show grants for jam@"192.168.88.0/24";
-- +---------------------------------------------------------------+
-- | Grants for jam@192.168.88.0/24 |
-- +---------------------------------------------------------------+
-- | GRANT USAGE ON *.* TO 'jam'@'192.168.88.0/24' |
-- | GRANT ALL PRIVILEGES ON `gamedb`.* TO 'jam'@'192.168.88.0/24' |
-- +---------------------------------------------------------------+
-- 2 rows in set (0.01 sec)
-- 撤销权限
mysql> revoke【瑞 - 沃克】 delete【迪 利 特】,drop【卓-普】 on【昂】 gamedb.* from【弗乱】 jam@"192.168.90.0/24" ;
-- mysql> revoke delete,drop on gamedb.* from jam@"192.168.88.0/24";
-- 查看撤销后jam用户的权限
-- mysql> show grants for jam@"192.168.88.0/24";
-- +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-- | Grants for jam@192.168.88.0/24 |
-- +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-- | GRANT USAGE ON *.* TO 'jam'@'192.168.88.0/24' |
-- | GRANT SELECT, INSERT, UPDATE, CREATE, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EVENT, TRIGGER ON `gamedb`.* TO 'jam'@'192.168.88.0/24' |
-- +-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-- 2 rows in set (0.00 sec)
8)修改yaya用户的登陆密码为123456#
mysql> set【赛特】 password【帕斯沃德】 for【fò】 yaya@"192.168.90.51"="123456" ;
-- mysql> set password for yaya@"192.168.88.40"="123456";
Query OK, 0 rows affected (0.05 sec)
9)删除jamadmin用户#
mysql> drop【卓-普】 user jamadmin@"localhost" ;
-- mysql> drop user jamadmin@"localhost";
Query OK, 0 rows affected (0.04 sec)

步骤二:在192.168.90.51测试授权#

命令格式 mysql -h数据库服务器ip地址 –u用户名 -p密码

1)在mysql51连接mysql50 (使用50 添加的yaya 用户)#
Terminal window
[root@mysql51 ~]# mysql -h192.168.90.50 -uyaya -p123456
#[root@mysql51 ~]# mysql -h 192.168.88.10 -uyaya -p123456
mysql> show【瘦】 grants【哥亮特】; //查看权限
-- mysql> show grants;
-- +---------------------------------------------------------------+
-- | Grants for yaya@192.168.88.40 |
-- +---------------------------------------------------------------+
-- | GRANT USAGE ON *.* TO 'yaya'@'192.168.88.40' |
-- | GRANT SELECT, INSERT ON `moershi`.* TO 'yaya'@'192.168.88.40' |
-- +---------------------------------------------------------------+
-- 2 rows in set (0.00 sec)
mysql> select【涩莱克特】 user(); -- 查看登陆信息
-- mysql> select user();
-- +--------------------+
-- | user() |
-- +--------------------+
-- | yaya@192.168.88.40 |
-- +--------------------+
-- 1 row in set (0.00 sec)
mysql> insert【因涩特】 into【因兔】 moershi.user(name,uid) values【挖柳斯】("jim",11); -- 插入数据权限内可以执行
-- mysql> insert into moershi.user(name,uid) values("jim",11);
Query OK, 1 row affected (0.06 sec)
mysql> delete【迪 利 特】 from【弗乱】 moershi.salary【晒了瑞】 ; -- 删表超出权限 报错
-- mysql> delete from moershi.salary;
-- ERROR 1142 (42000): DELETE command denied to user 'yaya'@'192.168.88.40' for table 'salary'

五、作业#

选择题#

  1. 在 MySQL 里,若要创建一个新用户 ‘test_user’ 并指定其可从任意主机登录,使用的命令是( A ) A. CREATE USER ‘test_user’@’%’ IDENTIFIED BY ‘password’; B. CREATE USER ‘test_user’@‘localhost’ IDENTIFIED BY ‘password’; C. CREATE USER ‘test_user’ IDENTIFIED BY ‘password’; D. ADD USER ‘test_user’@’%’ IDENTIFIED BY ‘password’;

  2. 下列哪种情况最适合使用 LOAD DATA INFILE 进行数据导入?( C ) A. 导入从网页爬取的不规则数据 B. 把 Excel 文件中的数据导入 MySQL C. 从 MySQL 导出的数据文件重新导入数据库 D. 导入图片数据到 MySQL

LOAD DATA INFILE最适合处理格式规整的文本文件
MySQL 导出的数据文件(如使用 SELECT ... INTO OUTFILE导出的)格式规整,最适合用此命令重新导入
  1. 想要撤销用户 ‘user1’ 对 ‘db1’ 数据库下 ‘table1’ 表的所有权限,正确的 SQL 语句是( A ) A. REVOKE ALL PRIVILEGES ON db1.table1 FROM ‘user1’@’%’; B. REMOVE ALL PRIVILEGES ON db1.table1 FROM ‘user1’@’%’; C. DELETE ALL PRIVILEGES ON db1.table1 FROM ‘user1’@’%’; D. CANCEL ALL PRIVILEGES ON db1.table1 FROM ‘user1’@’%’;

  2. 若要查看当前 MySQL 服务器上所有用户,应执行的命令是( B ) A. SHOW USERS; B. SELECT * FROM mysql.user; C. SHOW ALL USERS; D. LIST USERS;

  3. 执行数据导出时,若使用 SELECT ... INTO OUTFILE 语句,对导出文件所在目录的要求是( C ) A. 必须是 MySQL 安装目录 B. 必须是系统临时目录 C. 该目录必须是 MySQL 进程有写入权限的目录 D. 该目录必须是用户主目录

简答题#

  1. 阐述 MySQL 中用户管理的重要性以及主要的管理内容。

在 MySQL 中,实施有效的用户管理是保障数据库安全的核心环节。

  • 重要性:如果所有操作都使用拥有最高权限的 root 账户,会带来极大的安全隐患。一旦此账户泄露,攻击者可能完全控制数据库。通过用户管理,可以实现权限分离(不同用户只能访问其职责范围内的数据)、安全控制(防止误操作或恶意操作)和审计追踪(记录谁在何时做了什么)。
  • 主要管理内容:用户管理主要涉及用户账户的创建、修改、删除以及权限的授予与回收。具体操作包括使用 CREATE USER 创建用户(需指定用户名、允许登录的主机及密码),使用 DROP USER 删除用户(必须同时指定用户名和主机名),以及使用 ALTER USERSET PASSWORD 修改用户密码。所有用户信息都存储在 mysql 系统数据库的 user 表中。
  1. 说明 LOAD DATA INFILESELECT ... INTO OUTFILE 在数据导入导出方面的区别与联系。

LOAD DATA INFILESELECT ... INTO OUTFILE 是 MySQL 中用于高效数据导入和导出的两个互补命令。

  • 功能区别:SELECT ... INTO OUTFILE 主要用于将数据库查询结果导出到服务器主机上的指定格式文件中。而 LOAD DATA INFILE 则是其逆操作,用于将格式化的数据文件从服务器主机快速导入到数据库表中,执行效率通常远高于逐条 INSERT 语句。使用 LOCAL 关键字时,LOAD DATA LOCAL INFILE 可以从客户端主机读取文件。
  • 语法联系:这两个命令在指定数据格式时使用相似的子句,可以定义字段和行的处理方式,例如 FIELDS TERMINATED BY(字段分隔符)、LINES TERMINATED BY(行终止符)等。这意味着可以方便地使用 SELECT ... INTO OUTFILE 导出数据后,再用 LOAD DATA INFILE 按相同格式将其导入。
  1. 当在数据导入过程中遇到数据格式不匹配的问题,你会采取哪些解决办法?

在使用 LOAD DATA INFILE 导入数据时,如果遇到数据格式不匹配(如字段不对应、分隔符错误等),可以通过以下方式解决:

  • 明确指定格式选项:在 LOAD DATA INFILE 语句中,通过 FIELDS TERMINATED BYENCLOSED BYESCAPED BY 以及 LINES TERMINATED BY 等子句,确保指定的格式与源文件的实际格式完全匹配。
  • 忽略文件标题行:如果数据文件包含标题行,可以使用 IGNORE number LINES 子句跳过文件开头指定行数的内容。
  • 指定列映射:如果文件中的列顺序与数据库表中的列顺序不一致,可以在 LOAD DATA INFILE 语句末尾的 (col_name1, col_name2, ...) 部分明确指定列的顺序映射。
  • 字符集处理:如果文件编码与数据库字符集不匹配,可能产生乱码。可以使用 CHARACTER SET 子句指定输入文件的正确字符集。
  • 数据转换:LOAD DATA INFILE 支持在导入时通过 SET 子句对数据进行简单转换或计算,例如 SET id=id+5
  1. 描述如何对 MySQL 用户权限进行精细管理,以保障数据库安全。

为保障数据库安全,对用户权限进行精细化管理至关重要,核心原则是最小权限原则,即只授予用户完成其工作所必需的最小权限。

  • 权限层级:MySQL 的权限可以在不同层级进行设置,包括全局层级(所有数据库,如 *.*)、数据库层级(指定数据库的所有对象,如 mydb.*)、表层级(特定表)、列层级(表的特定列)甚至存储过程层级。例如,可以只授予某个用户对员工表的 姓名部门 列有 SELECT 权限,而无权查看 薪资 列。
  • 使用角色:可以创建角色,将一组常用的权限授予角色,然后再将角色授予用户,这极大地简化了权限管理。
  • 授权与回收:使用 GRANT 语句授予权限,使用 REVOKE 语句回收权限。授权后通常需要执行 FLUSH PRIVILEGES; 命令使新权限立即生效(在某些情况下 MySQL 会自动刷新)。
  • 网络限制:创建用户时,应通过 '用户名'@'主机名' 的格式限制用户只能从特定的 IP 地址或网段登录数据库,例如 'app_user'@'192.168.1.%'
  • 定期审计:定期检查用户权限,及时回收不必要的权限。可以使用 SHOW GRANTS FOR 'username'@'hostname'; 命令查看特定用户的权限。
  1. 简述在数据导出时,设置不同字段和行分隔符的作用及方法。

在数据导出时,通过 SELECT ... INTO OUTFILE 语句设置字段和行分隔符,主要是为了控制导出文件的格式,使其易于被其他程序(如 Excel、其他数据库系统或自定义脚本)正确解析和读取。

  • 作用:
    • 字段分隔符:定义了文件中每个字段(列)之间的分隔符号,默认为制表符 \t。常用符号有逗号 (,) 用于生成 CSV 文件。
    • 行分隔符:定义了文件中每条记录(行)之间的分隔符号,默认为换行符 \n。在不同操作系统中可能有所不同,例如在 Windows 系统中可能需要设置为 \r\n
  • 设置方法:在 SELECT ... INTO OUTFILE 语句中使用 FIELDSLINES 子句进行定义。
    SELECT * FROM your_table
    INTO OUTFILE '/path/to/export/file.csv'
    FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' -- 字段由逗号分隔,并用双引号包围
    LINES TERMINATED BY '\n'; -- 行以换行符结束
    通过合理设置这些分隔符和包围字符,可以确保导出的数据格式规整,避免因数据本身包含分隔符而导致解析错误。

操作题#

  1. 创建一个名为 ‘new_db’ 的数据库,接着创建用户 ‘admin_user’ 并赋予其对 ‘new_db’ 数据库的所有权限,然后创建用户 ‘guest_user’ 仅赋予对 ‘new_db’ 中 ‘table1’ 表的查询权限。

实战案例:MySQL 用户权限管理

这是一个完整的MySQL用户权限管理实战示例,展示如何创建数据库、用户,并分配不同级别的权限。

-- 数据库创建
mysql> create【克瑞特】 database【得塔-贝斯】 new_db【牛-滴比】;
-- mysql> create database new_db;
Query OK, 1 row affected (6.379 sec)
-- admin_user 用户创建
mysql> create【克瑞特】 user【右瑟】 admin_user【admin-右瑟】@"%" identified【爱--提伐】 by【拜】 "admin_user";
-- mysql> create user admin_user@"%" identified by "admin_user";
Query OK, 0 rows affected (7.111 sec)
-- admin_user 用户赋予权限
mysql> grant【古亮普】 all【ò】 on【昂】 new_db【牛-滴比】.* to admin_user【admin-右瑟】@"%";
-- mysql> grant all on new_db.* to admin_user@"%";
Query OK, 0 rows affected (0.680 sec)
-- guest_user 用户创建
mysql> create【克瑞特】 user【右瑟】 guest_user【盖斯特-右瑟】@"%" identified【爱--提伐】 by【拜】 "guest_user【盖斯特-右瑟】";
-- mysql> create user guest_user@"%" identified by "guest_user";
Query OK, 0 rows affected (0.224 sec)
-- 创建new_db.table1
mysql> create【克瑞特】 table【忒-部】 new_db【牛-滴比】.table1【忒--万】(id int【因特】);
-- mysql> create table new_db.table1(id int);
Query OK, 0 rows affected (2.602 sec)
-- guest_user 用户赋予权限
mysql> grant【古亮普】 select【涩莱克特】 on【昂】 new_db【牛-滴比】.table1【忒--万】 to guest_user【盖斯特-右瑟】@"%";
-- mysql> grant select on new_db.table1 to guest_user@"%";
Query OK, 0 rows affected (0.295 sec)

权限验证

检查创建的用户和权限:

-- 查看用户列表
mysql> select【涩莱克特】 user【右瑟】, host【厚斯特】 from【弗乱】 mysql.user【右瑟】 where【威尔】 user【右瑟】 like【赖特】 '%admin%' or user【右瑟】 like【赖特】 '%guest%';
-- mysql> select user, host from mysql.user where user like '%admin%' or user like '%guest%';
+-------------+------+
| user | host |
+-------------+------+
| admin_user | % |
| guest_user | % |
+-------------+------+
2 rows in set (0.00 sec)
-- 查看 admin_user 权限
mysql> show【瘦】 grants【古亮普 s】 for【fó】 admin_user【admin-右瑟】@"%";
-- mysql> show grants for admin_user@"%";
+-------------------------------------------------------------+
| Grants for admin_user@% |
+-------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'admin_user'@'%' |
| GRANT ALL PRIVILEGES ON `new_db`.* TO 'admin_user'@'%' |
+-------------------------------------------------------------+
-- 查看 guest_user 权限
mysql> show【瘦】 grants【古亮普 s】 for【fó】 guest_user【盖斯特-右瑟】@"%";
-- mysql> show grants for guest_user@"%";
+-------------------------------------------------------------+
| Grants for guest_user@% |
+-------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'guest_user'@'%' |
| GRANT SELECT ON `new_db`.`table1` TO 'guest_user'@'%' |
+-------------------------------------------------------------+

功能说明

  1. admin_user:拥有对 new_db 数据库的完全权限(包括创建表、插入、更新、删除等所有操作)
  2. guest_user:仅拥有对 new_db.table1 表的查询权限(只能查看数据,不能修改)
  3. 权限级别:展示了从数据库级别到表级别的权限控制
  4. 安全实践:体现了最小权限原则,只为用户分配完成工作所需的最小权限

mysql> — guest_user 用户创建 mysql> create user guest_user@”%” identified by “guest_user”; Query OK, 0 rows affected (0.224 sec)

mysql> — 创建new_db.table1 mysql> create table new_db.table1(id int); Query OK, 0 rows affected (2.602 sec)

mysql> — guest_user 用户赋予查询权限 mysql> grant select on new_db.table1 to guest_user@”%”; Query OK, 0 rows affected (0.295 sec)

2. 从 'employees' 表中导出员工的每一列信息到一个 TXT 文件,要求使用逗号作为字段分隔符,换行符作为行分隔符。之后将这个 TXT 文件中的数据导入到新创建的 'employees_backup' 表。
```sql
mysql>-- 导出moershi.employees
mysql> select * from moershi.employees into outfile "/myload/employees.txt" fields terminated by "," lines terminated by "\n";
Query OK, 136 rows affected (0.200 sec)
mysql>-- 创建new_db.employees_backup
mysql> create table new_db.employees_backup like moershi.employees;
Query OK, 0 rows affected (3.269 sec)
mysql> -- 导入
mysql> load data infile "/myload/employees.txt" into table new_db.employees_backup fields terminated by "," lines terminated by "\n";
Query OK, 136 rows affected (1.059 sec)
Records: 136 Deleted: 0 Skipped: 0 Warnings: 0
mysql> select count(*) from new_db.employees_backup;
+----------+
| count(*) |
+----------+
| 136 |
+----------+
1 row in set (0.351 sec)
  1. 对用户 ‘editor_user’ 的权限进行调整,撤销其对 ‘news’ 数据库下 ‘articles’ 表的删除权限,同时增加更新权限。
mysql> --创建数据库
mysql> create database news;
Query OK, 1 row affected (0.664 sec)
mysql>-- 创建表
mysql> create table news.articles(id int,name varchar(9));
Query OK, 0 rows affected (2.513 sec)
mysql>-- 创建用户
mysql> create user editor_user@"%" identified by "editor_user";
Query OK, 0 rows affected (1.115 sec)
mysql>-- 赋予权限
mysql> grant all on news.articles to editor_user@"%";
Query OK, 0 rows affected (0.571 sec)
mysql>-- 撤销权限
mysql> revoke delete on news.articles from editor_user@"%";
Query OK, 0 rows affected (0.438 sec)
mysql>-- 增加权限
mysql> grant update on news.articles to editor_user@"%";
Query OK, 0 rows affected (0.469 sec)
  1. 先创建一个新用户 ‘temp_user’,仅赋予其对 ‘test_db’ 数据库下 ‘logs’ 表的插入权限,在完成数据插入任务后,删除该用户。
mysql> --创建数据库
mysql> create database test_db;
Query OK, 1 row affected (0.648 sec)
mysql> -- 创建表
mysql> create table test_db.logs(
-> id int,
-> logs varchar(200));
Query OK, 0 rows affected (1.589 sec)
mysql> 创建用户
mysql> create user temp_user@"%" identified by "temp_user";
Query OK, 0 rows affected (0.760 sec)
mysql> --赋予权限
mysql> grant insert on test_db.logs to temp_user@"%";
Query OK, 0 rows affected (0.676 sec)
mysql> --插入数据
mysql> insert into test_db.logs values(1,"程序卡死");
Query OK, 1 row affected (0.291 sec)
mysql> --删除用户
mysql> drop user temp_user@"%";
Query OK, 0 rows affected (0.693 sec)
07 mysql之数据导入导出与用户管理
https://fuwari.vercel.app/posts/数据库/07-mysql之数据导入导出与用户管理/
作者
肥猫少杰
发布于
2026-06-03
许可协议
CC BY-NC-SA 4.0