Linux系统中操作Docker中的MySQL数据库操作相关命令

流程:

创建数据库,创建用户,给数据库赋值用户权限,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@localhostuser1@% 会被视为两个不同的用户。

注意事项

  • 只有拥有 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.创建数据库并指定用户访问

通常流程是:

  1. 先创建数据库(用root等高权限用户):

    sql 复制代码
    CREATE DATABASE IF NOT EXISTS newdb CHARACTER SET utf8mb4 collate utf8mb4_general_ci;
  2. 再创建用户并授予该数据库的权限:

    sql 复制代码
    CREATE USER 'newuser'@'%' IDENTIFIED BY 'password';
    GRANT ALL PRIVILEGES ON newdb.* TO 'newuser'@'%';
    FLUSH PRIVILEGES;
  3. 之后,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;

总结

  • 用户与数据库是独立的:先创建用户,再分配对数据库的权限
  • 推荐流程:创建数据库 → 创建用户 → 给用户分配该数据库的权限 → 用户用自己的账号登录操作