[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...amysql> 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 0setenforce: SELinux is disabled
-- 重启服务[root@mysql50 ~]# systemctl【西斯屯-ctl】 restart【 率 s 达r】 mysqld-- [root@mha ~]# systemctl restart mysqld
-- 管理员员登陆查看目录[root@mysql50 ~]# mysql -uroot -pNSD123456...amysql> 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...amysql> 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 /myloadpasswdmysql>
-- 导入数据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.txt23 /myload/user.txt
mysql>mysql> system【西斯屯】 vim /myload【my漏德】/user.txt-- mysql> system vim /myload/user.txtroot x 0 0 root /root /bin/bashbin x 1 1 bin /bin /sbin/nologindaemon x 2 2 daemon /sbin /sbin/nologinadm x 3 4 adm /var/adm /sbin/nologinlp x 4 7 lp /var/spool/lpd /sbin/nologinsync x 5 0 sync /sbin /bin/syncshutdown x 6 0 shutdown /sbin /sbin/shutdownhalt x 7 0 halt /sbin /sbin/haltmail x 8 12 mail /var/spool/mail /sbin/nologinoperator x 11 0 operator /root /sbin/nologingames x 12 100 games /usr/games /sbin/nologinftp x 14 50 FTP User /var/ftp /sbin/nologinnobody x 65534 65534 Kernel Overflow User / /sbin/nologindbus x 81 81 System message bus / /sbin/nologinsystemd-coredump x 999 997 systemd Core Dumper / /sbin/nologinsystemd-resolve x 193 193 systemd Resolver / /sbin/nologinpolkitd x 998 995 User for polkitd / /sbin/nologinunbound x 997 994 Unbound DNS resolver /etc/unbound /sbin/nologintss x 59 59 Account used for TPM access /dev/null /sbin/nologinchrony x 996 993 /var/lib/chrony /sbin/nologinsshd x 74 74 Privilege-separated SSH /var/empty/sshd /sbin/nologintcpdump x 72 72 / /sbin/nologinmysql 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 问题
- 允许所有主机使用root连接数据库服务,对所有库和所有表有完全权限、密码为123qqq…A
- 允许192.168.90.0/24网段主机使用jam连接数据库服务,仅对gamedb库有完全权限、密码为moershi
- 允许在本机使用jamadmin用户连接数据库服务器,仅对moershi库有查询、插入、更新、删除记录的权限,密码为NSD123456…a
- 允许192.168.90.51主机使用yaya用户连接数据库服务,仅对moershi库有查询权限,密码为moershi1
- 给yaya用户追加,插入记录的权限
- 撤销jam用户删库、删表、删记录的权限
- 删除jamadmin用户
4.2 方案
授权是在数据库服务器里添加用户并设置权限及密码;重复执行grant【古亮普】命令时如果库名和用户名不变时,是追加权限。授权步骤如下:
授权信息保存在mysql库的如下表里:
- user表 保存已有的授权用户及用户对所有库的权限
- db表 保存已有授权用户对某一个库的访问权限
- tables【忒-部s】_priv【破略夫】表 记录已有授权用户对某一张表的访问权限
- columns【科勒姆 s】_priv【破略夫】表 记录已有授权用户对某一个表头的访问权限
在192.168.90.50 数据库服务器练习用户授权
在192.168.90.51 数据库服务器测试
通过模板机克隆一台机器,修改主机名和IP地址
[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服务软件
[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 mysqld4.3 步骤
实现此案例需要按照如下步骤进行。
步骤一:在192.168.90.50 数据库服务器做如下授权练习
命令操作如下所示:
-- 数据库管理员登陆[root@mysql51 ~]# mysql -uroot -pNSD123456...a1)允许所有主机使用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语句明确创建用户。
-
授予特定数据库的所有表权限 假设想让用户
report_user可以从任何主机连接,并拥有对数据库samp_db中所有表进行增删改查的权限,可以使用以下命令:sql GRANT SELECT, INSERT, UPDATE, DELETE ON samp_db.* TO 'report_user'@'%'; -
创建用户并授权(完整步骤) 这是一个更清晰、安全的做法,将创建用户和授权分步进行:
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;命令是为了让服务器重新加载权限表,确保新的权限设置立即生效。 -
查看用户权限 授权完成后,可以验证权限是否已正确分配:
sql SHOW GRANTS FOR 'dev_user'@'localhost'; -
撤销权限 如果需要收回某些权限,可以使用
REVOKE【瑞 - 沃克】语句。例如,撤销dev_user对test_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: NCreate_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: N1 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 用户)
[root@mysql51 ~]# mysql -h192.168.90.50 -uyaya -p123456#[root@mysql51 ~]# mysql -h 192.168.88.10 -uyaya -p123456mysql> 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'五、作业
选择题
-
在 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’;
-
下列哪种情况最适合使用
LOAD DATA INFILE进行数据导入?( C ) A. 导入从网页爬取的不规则数据 B. 把 Excel 文件中的数据导入 MySQL C. 从 MySQL 导出的数据文件重新导入数据库 D. 导入图片数据到 MySQL
LOAD DATA INFILE最适合处理格式规整的文本文件MySQL 导出的数据文件(如使用 SELECT ... INTO OUTFILE导出的)格式规整,最适合用此命令重新导入-
想要撤销用户 ‘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’@’%’;
-
若要查看当前 MySQL 服务器上所有用户,应执行的命令是( B ) A. SHOW USERS; B. SELECT * FROM mysql.user; C. SHOW ALL USERS; D. LIST USERS;
-
执行数据导出时,若使用
SELECT ... INTO OUTFILE语句,对导出文件所在目录的要求是( C ) A. 必须是 MySQL 安装目录 B. 必须是系统临时目录 C. 该目录必须是 MySQL 进程有写入权限的目录 D. 该目录必须是用户主目录
简答题
- 阐述 MySQL 中用户管理的重要性以及主要的管理内容。
在 MySQL 中,实施有效的用户管理是保障数据库安全的核心环节。
- 重要性:如果所有操作都使用拥有最高权限的
root账户,会带来极大的安全隐患。一旦此账户泄露,攻击者可能完全控制数据库。通过用户管理,可以实现权限分离(不同用户只能访问其职责范围内的数据)、安全控制(防止误操作或恶意操作)和审计追踪(记录谁在何时做了什么)。 - 主要管理内容:用户管理主要涉及用户账户的创建、修改、删除以及权限的授予与回收。具体操作包括使用
CREATE USER创建用户(需指定用户名、允许登录的主机及密码),使用DROP USER删除用户(必须同时指定用户名和主机名),以及使用ALTER USER或SET PASSWORD修改用户密码。所有用户信息都存储在mysql系统数据库的user表中。
- 说明
LOAD DATA INFILE和SELECT ... INTO OUTFILE在数据导入导出方面的区别与联系。
LOAD DATA INFILE 和 SELECT ... 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按相同格式将其导入。
- 当在数据导入过程中遇到数据格式不匹配的问题,你会采取哪些解决办法?
在使用 LOAD DATA INFILE 导入数据时,如果遇到数据格式不匹配(如字段不对应、分隔符错误等),可以通过以下方式解决:
- 明确指定格式选项:在
LOAD DATA INFILE语句中,通过FIELDS TERMINATED BY、ENCLOSED BY、ESCAPED BY以及LINES TERMINATED BY等子句,确保指定的格式与源文件的实际格式完全匹配。 - 忽略文件标题行:如果数据文件包含标题行,可以使用
IGNORE number LINES子句跳过文件开头指定行数的内容。 - 指定列映射:如果文件中的列顺序与数据库表中的列顺序不一致,可以在
LOAD DATA INFILE语句末尾的(col_name1, col_name2, ...)部分明确指定列的顺序映射。 - 字符集处理:如果文件编码与数据库字符集不匹配,可能产生乱码。可以使用
CHARACTER SET子句指定输入文件的正确字符集。 - 数据转换:
LOAD DATA INFILE支持在导入时通过SET子句对数据进行简单转换或计算,例如SET id=id+5。
- 描述如何对 MySQL 用户权限进行精细管理,以保障数据库安全。
为保障数据库安全,对用户权限进行精细化管理至关重要,核心原则是最小权限原则,即只授予用户完成其工作所必需的最小权限。
- 权限层级:MySQL 的权限可以在不同层级进行设置,包括全局层级(所有数据库,如
*.*)、数据库层级(指定数据库的所有对象,如mydb.*)、表层级(特定表)、列层级(表的特定列)甚至存储过程层级。例如,可以只授予某个用户对员工表的姓名和部门列有SELECT权限,而无权查看薪资列。 - 使用角色:可以创建角色,将一组常用的权限授予角色,然后再将角色授予用户,这极大地简化了权限管理。
- 授权与回收:使用
GRANT语句授予权限,使用REVOKE语句回收权限。授权后通常需要执行FLUSH PRIVILEGES;命令使新权限立即生效(在某些情况下 MySQL 会自动刷新)。 - 网络限制:创建用户时,应通过
'用户名'@'主机名'的格式限制用户只能从特定的 IP 地址或网段登录数据库,例如'app_user'@'192.168.1.%'。 - 定期审计:定期检查用户权限,及时回收不必要的权限。可以使用
SHOW GRANTS FOR 'username'@'hostname';命令查看特定用户的权限。
- 简述在数据导出时,设置不同字段和行分隔符的作用及方法。
在数据导出时,通过 SELECT ... INTO OUTFILE 语句设置字段和行分隔符,主要是为了控制导出文件的格式,使其易于被其他程序(如 Excel、其他数据库系统或自定义脚本)正确解析和读取。
- 作用:
- 字段分隔符:定义了文件中每个字段(列)之间的分隔符号,默认为制表符
\t。常用符号有逗号 (,) 用于生成 CSV 文件。 - 行分隔符:定义了文件中每条记录(行)之间的分隔符号,默认为换行符
\n。在不同操作系统中可能有所不同,例如在 Windows 系统中可能需要设置为\r\n。
- 字段分隔符:定义了文件中每个字段(列)之间的分隔符号,默认为制表符
- 设置方法:在
SELECT ... INTO OUTFILE语句中使用FIELDS和LINES子句进行定义。通过合理设置这些分隔符和包围字符,可以确保导出的数据格式规整,避免因数据本身包含分隔符而导致解析错误。SELECT * FROM your_tableINTO OUTFILE '/path/to/export/file.csv'FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' -- 字段由逗号分隔,并用双引号包围LINES TERMINATED BY '\n'; -- 行以换行符结束
操作题
- 创建一个名为 ‘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.table1mysql> 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'@'%' |+-------------------------------------------------------------+功能说明:
- admin_user:拥有对
new_db数据库的完全权限(包括创建表、插入、更新、删除等所有操作) - guest_user:仅拥有对
new_db.table1表的查询权限(只能查看数据,不能修改) - 权限级别:展示了从数据库级别到表级别的权限控制
- 安全实践:体现了最小权限原则,只为用户分配完成工作所需的最小权限
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' 表。```sqlmysql>-- 导出moershi.employeesmysql> 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_backupmysql> 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)- 对用户 ‘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)- 先创建一个新用户 ‘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)