流程:
创建数据库,创建用户,给数据库赋值用户权限,copy sql执行文件到容器,导入执行文件数据到数据库,进入容器,用户登录,切换数据库,查询表,查询sql语句
一:常用命令和方法
1. 登录Docker中的MySQL容器
首先需要知道MySQL容器的名称或ID,然后进入容器:
bash
# 查看所有运行的容器,找到MySQL容器的ID或名称
docker ps
# 进入MySQL容器(假设容器名为mysql-container)
docker exec -it mysql-container bash
2. 在容器内登录MySQL数据库
bash
# 使用mysql命令登录,需要输入密码
mysql -u 用户名 -p
# 例如使用root用户登录
mysql -u root -p
输入密码后即可进入MySQL命令行界面。
3. 查看当前所有数据库
在MySQL命令行中执行:
sql
show databases;
4. 查看指定数据库下的表
首先需要切换到该数据库:
sql
use 数据库名;
然后查看表:
sql
show tables;
5.退出MySQL数据库命令行
在使用 use 数据库名;
切换到指定数据库后,若要退出MySQL命令行界面,可执行:
sql
exit;
或简写为:
sql
quit;
也可以直接按 Ctrl + D
快捷键退出。
6.查看所有用户的基本信息
MySQL的用户信息存储在 mysql
系统数据库的 user
表中,执行以下SQL语句即可查看所有用户:
sql
-- 切换到mysql系统数据库(可选,不切换也能查询)
use mysql;
-- 查看所有用户的用户名和允许登录的来源
SELECT user, host FROM user;
user
字段:显示用户名。host
字段:显示该用户允许从哪个主机登录(localhost
表示本地,%
表示任意远程主机)。
查看更详细的用户信息
如果需要查看用户的更多信息(如密码加密后的哈希值、是否锁定等),可以查询 user
表的所有字段:
sql
-- 查看所有用户的完整信息(字段较多,建议按需筛选)
SELECT * FROM mysql.user;
常用字段说明:
user
:用户名host
:允许登录的主机authentication_string
:密码的加密存储(MySQL 5.7+,旧版本为password
字段)account_locked
:是否锁定用户(Y
表示锁定,N
表示未锁定)create_time
:用户创建时间
统计用户总数
如果只想知道当前有多少个用户(去重统计),可以用 COUNT
函数:
sql
-- 统计用户总数(同一用户名不同host视为不同用户)
SELECT COUNT(*) AS 总用户数 FROM mysql.user;
例如,user1@localhost
和 user1@%
会被视为两个不同的用户。
注意事项
- 只有拥有
SELECT
权限的用户(如root
)才能查询mysql.user
表。 - 执行操作前需先登录MySQL(通过
mysql -u 用户名 -p
命令)。
通过以上方法,即可清晰地查看MySQL中的所有用户及相关信息。
7. 执行SQL语句
直接在MySQL命令行中输入SQL语句并以分号结尾即可,例如:
sql
-- 查询表数据
select * from 表名 limit 10;
-- 插入数据
insert into 表名 (字段1,字段2) values ('值1','值2');
二:创建数据库:
7.创建数据库并指定用户访问
通常流程是:
-
先创建数据库(用root等高权限用户):
sqlCREATE DATABASE IF NOT EXISTS newdb CHARACTER SET utf8mb4 collate utf8mb4_general_ci;
-
再创建用户并授予该数据库的权限:
sqlCREATE USER 'newuser'@'%' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON newdb.* TO 'newuser'@'%'; FLUSH PRIVILEGES;
-
之后,
newuser
即可用自己的账号登录并操作newdb
数据库。
在 MySQL 中,%
和 localhost
是用于限制用户访问来源主机 的通配符,核心区别在于允许从哪些主机连接到 MySQL 服务器,具体差异如下:
1. %
:允许所有远程主机访问
- 含义 :
%
是通配符,表示"所有主机",包括:- 远程服务器(如另一台服务器通过网络连接)。
- 本地服务器但通过 IP 地址(如
127.0.0.1
)访问,而非 Unix socket。
- 场景:需要从其他服务器或客户端远程连接 MySQL 时使用(如应用服务器连接数据库服务器)。
- 示例 :
GRANT ALL ON *.* TO 'user'@'%';
表示user
可以从任何 IP 地址(包括远程)连接 MySQL。
2. localhost
:仅允许本地(服务器自身)访问
- 含义 :严格限制为"本地主机",且仅允许通过 Unix socket (本地进程间通信方式)连接,不允许通过网络 IP(即使是
127.0.0.1
)访问。 - 场景:仅允许 MySQL 服务器自身的进程访问(如服务器上的脚本、容器内的本地连接)。
- 示例 :
GRANT ALL ON *.* TO 'user'@'localhost';
表示user
只能在 MySQL 所在的服务器/容器内部,通过mysql -u user -p
直接登录(不通过网络 IP)。
关键区别对比
特性 | 'user'@'%' |
'user'@'localhost' |
---|---|---|
访问来源 | 所有主机(本地+远程) | 仅本地服务器/容器内部 |
连接方式 | 支持网络 IP 连接(如 192.168.x.x ) |
仅支持 Unix socket 连接 |
典型用途 | 远程应用服务器连接数据库 | 服务器本地脚本、容器内操作 |
安全性 | 较低(暴露远程访问风险) | 较高(限制本地访问) |
特殊注意:localhost
vs 127.0.0.1
'user'@'localhost'
:不允许通过127.0.0.1
连接(即使是本地回环 IP),仅认 Unix socket。'user'@'127.0.0.1'
:允许通过127.0.0.1
网络连接(但不包括其他 IP),与localhost
不同。
总结
- 若需要远程连接 (如应用服务器访问数据库),用
%
或具体 IP(如192.168.1.%
)。 - 若仅允许数据库所在服务器/容器内部访问 ,用
localhost
(更安全)。 - 两者可以共存:同一用户名可以同时配置
@'%'
和@'localhost'
,分别对应不同的访问场景和权限。
8. 导入dump文件
有两种常用方法:
方法一:在容器外导入
bash
# 将本地的dump文件导入到容器中的MySQL
docker exec -i mysql-container mysql -u 用户名 -p 目标数据库名 < /本地路径/备份文件.sql
执行后会提示输入密码,输入正确后开始导入。
方法二:先将文件复制到容器内再导入 (亲测可行)
bash
# 复制本地文件到容器内
docker cp /本地路径/备份文件.sql mysql-container:/tmp/
# 进入容器
docker exec -it mysql-container bash
# 在容器内导入
mysql -u 用户名 -p 目标数据库名 < /tmp/备份文件.sql
三:创建新用户及赋予数据库权限
1. MySQL创建新用户及权限管理
MySQL的用户管理和数据库管理是分离的:先创建用户,再为用户分配对指定数据库的权限(而非在用户下创建数据库)。
(1)创建新用户
语法格式:
sql
CREATE USER '用户名'@'访问来源' IDENTIFIED BY '密码';
-
访问来源
:指定用户可从哪里登录,localhost
表示仅本地,%
表示允许远程登录。 -
示例:
sql-- 创建只能本地登录的用户user1,密码为123456 CREATE USER 'user1'@'localhost' IDENTIFIED BY '123456'; -- 创建允许远程登录的用户user2 CREATE USER 'user2'@'%' IDENTIFIED BY 'abc123';
(2)为用户分配数据库权限
创建用户后,需手动分配权限(如允许操作哪个数据库):
sql
-- 授予用户对指定数据库的所有权限
GRANT ALL PRIVILEGES ON 数据库名.* TO '用户名'@'访问来源';
-- 示例:允许user1操作testdb数据库的所有表
GRANT ALL PRIVILEGES ON testdb.* TO 'user1'@'localhost';
-- 刷新权限使其生效
FLUSH PRIVILEGES;
总结
- 用户与数据库是独立的:先创建用户,再分配对数据库的权限
- 推荐流程:创建数据库 → 创建用户 → 给用户分配该数据库的权限 → 用户用自己的账号登录操作