# MySQL速成指南 **Repository Path**: gjj2006/my-sql-quick-guide ## Basic Information - **Project Name**: MySQL速成指南 - **Description**: 一分钟速成MySQL,明眼人一看就能学会的教程,有手就行一秒搞定! - **Primary Language**: Unknown - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-12-08 - **Last Updated**: 2025-12-09 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MySQL 简明安装配置教程 > 基于 Xubuntu 20.04.6 --- ## 一、安装 MySQL ### 1. 更新系统软件包列表 ```bash sudo apt update ``` **说明:** - `sudo`:以管理员权限执行命令(需要输入你的用户密码) - `apt update`:更新软件包索引,确保能安装最新版本的软件 - 这一步不会安装任何软件,只是刷新可用软件列表 --- ### 2. 安装 MySQL 服务器 ```bash sudo apt install mysql-server -y ``` **说明:** - `mysql-server`:MySQL 数据库服务器软件包 - `-y`:自动确认安装,不需要手动输入 yes - 安装过程需要几分钟,取决于网络速度 - 安装完成后 MySQL 服务会自动启动 --- ### 3. 检查 MySQL 服务状态 ```bash sudo systemctl status ``` **说明:** - 如果看到 `active (running)` 字样,说明服务正在运行 - 如果显示 `inactive (dead)`,说明服务未启动 - 按 `q` 键退出状态查看界面 **参考输出:** ``` ● mysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; enabled) Active: active (running) since ... ``` --- ### 4. 启动 MySQL 服务(如果未运行) 如果上一步显示服务未运行,执行以下命令启动: ```bash sudo systemctl start mysql ``` **或者使用传统方式:** ```bash sudo /etc/init.d/mysql start ``` **说明:** - 两种方式效果相同,推荐使用第一种(systemctl) - 启动后可以再次用 `sudo systemctl status mysql` 检查状态 --- ### 5. 验证安装 ```bash mysql --version ``` **预期输出:** ``` mysql Ver 8.0.xx for Linux on x86_64 (Ubuntu) ``` **说明:** - 显示 MySQL 版本信息说明安装成功 - 版本号可能不同,这是正常的 --- ## 二、安全配置(重要!) ### 1. 运行安全配置脚本 ```bash sudo mysql_secure_installation ``` **说明:** - 这是 MySQL 官方提供的安全配置向导 - 会引导你完成一系列安全设置 - 强烈建议所有选项都按推荐配置 --- ### 2. 配置向导详细步骤 #### 步骤 1:是否启用密码验证插件? ``` Would you like to setup VALIDATE PASSWORD component? (Y/n) ``` **推荐选择:Y(是)** **说明:** - 这个插件会强制要求设置高强度密码 - 可以防止使用过于简单的密码(如 123456) - 适合生产环境和学习良好习惯 --- #### 步骤 2:选择密码强度等级 ``` There are three levels of password validation policy: LOW Length >= 8 MEDIUM Length >= 8, numeric, mixed case, and special characters STRONG Length >= 8, numeric, mixed case, special characters and dictionary file Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG: ``` **推荐选择:1(MEDIUM - 中等强度)** **说明:** - LOW(0):只要求长度 ≥ 8 位 - MEDIUM(1):要求 8 位以上 + 数字 + 大小写字母 + 特殊字符 - STRONG(2):在 MEDIUM 基础上还会检查字典文件,过于严格 - 对于学习和开发环境,MEDIUM 是最佳平衡 --- #### 步骤 3:设置 root 用户密码 ``` New password: Re-enter new password: ``` **操作:** - 输入你的密码(输入时不会显示任何字符,这是正常的) - 再次输入相同密码确认 **密码示例(MEDIUM 强度):** - `MyPass123!` - `Admin@2024` - `Secure#Pass99` **重要提示:** - 请务必记住这个密码! - 建议写在安全的地方 - 这是 MySQL 最高权限账户的密码 --- #### 步骤 4:是否移除匿名用户? ``` Remove anonymous users? (Y/n) ``` **推荐选择:Y(是)** **说明:** - MySQL 默认安装时会创建一个无需密码的匿名用户 - 这是一个严重的安全隐患 - 删除它可以防止未授权访问 --- #### 步骤 5:是否禁止 root 远程登录? ``` Disallow root login remotely? (Y/n) ``` **推荐选择:Y(是)** **说明:** - 禁止 root 用户从其他机器远程连接 - root 只能在本机登录,大大提高安全性 - 如果需要远程管理,应该创建专门的用户(后续会讲) **特殊情况:** - 如果你需要从其他电脑连接这台 MySQL 服务器,可以选择 n(否) - 但这会降低安全性,仅适用于内网测试环境 --- #### 步骤 6:是否删除测试数据库? ``` Remove test database and access to it? (Y/n) ``` **推荐选择:Y(是)** **说明:** - MySQL 默认会创建一个名为 `test` 的数据库 - 任何用户都可以访问这个数据库 - 删除它可以避免潜在的安全问题 --- #### 步骤 7:是否立即刷新权限表? ``` Reload privilege tables now? (Y/n) ``` **推荐选择:Y(是)** **说明:** - 使刚才的所有配置立即生效 - 不需要重启 MySQL 服务 - 必须选择 Y,否则配置不会生效 --- ### 3. 配置完成提示 看到以下信息说明配置成功: ``` All done! ``` --- ## 三、首次登录 MySQL ### 1. 使用 root 用户登录 ```bash sudo mysql -u root -p ``` **说明:** - `-u root`:指定用户名为 root - `-p`:表示需要输入密码 - 回车后会提示输入密码,输入你刚才设置的密码 --- ### 2. 成功登录的标志 看到以下提示符说明已成功登录: ``` mysql> ``` 你可以输入 SQL 命令了! --- ### 3. 测试基本命令 ```sql -- 查看所有数据库 SHOW DATABASES; -- 查看当前 MySQL 版本 SELECT VERSION(); -- 查看当前登录用户 SELECT USER(); -- 退出 MySQL EXIT; ``` **说明:** - 每条 SQL 命令必须以分号 `;` 结尾 - SQL 命令不区分大小写,但习惯上关键字用大写 - `--` 开头的是注释,不会被执行 --- ## 四、常用管理命令 ### 1. 服务管理 ```bash # 启动 MySQL 服务 sudo systemctl start mysql # 停止 MySQL 服务 sudo systemctl stop mysql # 重启 MySQL 服务 sudo systemctl restart mysql # 查看服务状态 sudo systemctl status mysql # 设置开机自启动 sudo systemctl enable mysql # 取消开机自启动 sudo systemctl disable mysql ``` --- ### 2. 检查 MySQL 是否在运行 ```bash # 方法 1:查看进程 ps aux | grep mysql # 方法 2:查看端口(MySQL 默认端口 3306) sudo netstat -tlnp | grep 3306 ``` --- ## 五、常见问题解决 ### 问题 1:忘记 root 密码怎么办? **解决方法:** 1. 停止 MySQL 服务 ```bash sudo systemctl stop mysql ``` 2. 跳过权限验证启动 MySQL ```bash sudo mysqld_safe --skip-grant-tables & ``` 3. 无密码登录 ```bash mysql -u root ``` 4. 重置密码 ```sql FLUSH PRIVILEGES; ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码'; EXIT; ``` 5. 重启 MySQL ```bash sudo systemctl restart mysql ``` --- ### 问题 2:无法启动 MySQL 服务 **解决方法:** 1. 查看错误日志 ```bash sudo tail -f /var/log/mysql/error.log ``` 2. 检查端口占用 ```bash sudo lsof -i :3306 ``` 3. 检查磁盘空间 ```bash df -h ``` --- ### 问题 3:Access denied for user 'root'@'localhost' **原因:** 密码错误或权限问题 **解决方法:** 尝试使用 sudo 登录: ```bash sudo mysql ``` 如果能登录,说明需要修改认证方式: ```sql ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码'; FLUSH PRIVILEGES; ``` --- ## 六、创建普通用户(重要!安全最佳实践) ### 为什么不应该直接使用 root 用户? **安全原则:** - ❌ **错误做法**:允许 root 远程登录,绑定 0.0.0.0 - ✅ **正确做法**:root 仅限本地,创建专用用户进行日常操作 **原因:** - root 拥有最高权限,一旦泄露后果严重 - 专用用户可以限制权限范围,降低风险 - 便于审计和追踪操作记录 --- ### 1. 创建新用户 #### 方式一:仅本地访问的用户(推荐用于开发) ```sql -- 登录 MySQL sudo mysql -u root -p -- 创建本地用户 CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'Strong@Pass123'; -- 授予特定数据库的所有权限 GRANT ALL PRIVILEGES ON mydatabase.* TO 'myuser'@'localhost'; -- 刷新权限 FLUSH PRIVILEGES; ``` **说明:** - `myuser`:用户名,可自定义 - `localhost`:只能从本机连接 - `mydatabase.*`:只能访问 mydatabase 数据库 --- #### 方式二:允许特定 IP 访问(推荐用于内网) ```sql -- 创建允许特定 IP 访问的用户 CREATE USER 'myuser'@'192.168.1.100' IDENTIFIED BY 'Strong@Pass123'; -- 授予权限 GRANT ALL PRIVILEGES ON mydatabase.* TO 'myuser'@'192.168.1.100'; FLUSH PRIVILEGES; ``` **说明:** - `192.168.1.100`:只允许这个 IP 地址连接 - 适合内网环境,指定可信任的机器 --- #### 方式三:允许特定网段访问 ```sql -- 创建允许整个网段访问的用户 CREATE USER 'myuser'@'192.168.1.%' IDENTIFIED BY 'Strong@Pass123'; -- 授予权限 GRANT ALL PRIVILEGES ON mydatabase.* TO 'myuser'@'192.168.1.%'; FLUSH PRIVILEGES; ``` **说明:** - `192.168.1.%`:允许 192.168.1.0/24 网段的所有 IP - 适合局域网内多台机器访问 --- #### ⚠️ 方式四:允许任意 IP 访问(仅测试环境) ```sql -- 创建允许任意 IP 访问的用户 CREATE USER 'myuser'@'%' IDENTIFIED BY 'Strong@Pass123'; -- 授予权限 GRANT ALL PRIVILEGES ON mydatabase.* TO 'myuser'@'%'; FLUSH PRIVILEGES; ``` **⚠️ 安全警告:** - `%` 表示任意 IP 都可以连接 - **极度危险**,容易被暴力破解和攻击 - **仅适用于**:隔离的测试环境、有防火墙保护的内网 - **生产环境禁止使用** --- ### 2. 权限管理最佳实践 #### 按需授权(最小权限原则) ```sql -- 只读权限(适合数据分析人员) GRANT SELECT ON mydatabase.* TO 'readonly_user'@'localhost'; -- 读写权限(适合应用程序) GRANT SELECT, INSERT, UPDATE, DELETE ON mydatabase.* TO 'app_user'@'192.168.1.%'; -- 完整权限但不含授权权限(适合开发人员) GRANT ALL PRIVILEGES ON mydatabase.* TO 'dev_user'@'localhost'; -- 查看用户权限 SHOW GRANTS FOR 'myuser'@'localhost'; ``` --- ### 3. 查看和删除用户 ```sql -- 查看所有用户 SELECT user, host FROM mysql.user; -- 删除用户 DROP USER 'myuser'@'localhost'; -- 撤销权限 REVOKE ALL PRIVILEGES ON mydatabase.* FROM 'myuser'@'localhost'; FLUSH PRIVILEGES; ``` --- ## 七、配置远程访问(可选) ### ⚠️ 安全提醒 **在配置远程访问前,请确认:** 1. 你真的需要远程访问吗?(本地开发通常不需要) 2. 是否在安全的内网环境? 3. 是否配置了防火墙? 4. 是否使用了强密码? --- ### 1. 修改 MySQL 配置文件 ```bash # 编辑配置文件 sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf ``` **找到以下行:** ``` bind-address = 127.0.0.1 ``` **修改为:** #### 选项 1:允许所有 IP(需配合防火墙) ``` bind-address = 0.0.0.0 ``` #### 选项 2:允许特定 IP ``` bind-address = 192.168.1.10 ``` #### 选项 3:注释掉该行(监听所有接口) ``` # bind-address = 127.0.0.1 ``` **保存并退出:** - 按 `Ctrl + O` 保存 - 按 `Ctrl + X` 退出 --- ### 2. 重启 MySQL 服务 ```bash sudo systemctl restart mysql ``` --- ### 3. 配置防火墙(重要!) ```bash # 允许特定 IP 访问 MySQL 端口 sudo ufw allow from 192.168.1.100 to any port 3306 # 或允许整个网段 sudo ufw allow from 192.168.1.0/24 to any port 3306 # 查看防火墙状态 sudo ufw status ``` **⚠️ 警告:不要执行以下命令(除非你知道风险)** ```bash # ❌ 危险:允许所有 IP 访问 3306 端口 sudo ufw allow 3306 ``` --- ### 4. 测试远程连接 **从远程机器测试:** ```bash mysql -h 192.168.1.10 -u myuser -p ``` **说明:** - `-h`:MySQL 服务器的 IP 地址 - `-u`:用户名 - `-p`:提示输入密码 --- ### 5. 远程访问安全加固 #### 方法 1:使用 SSH 隧道(最安全) ```bash # 在本地机器执行 ssh -L 3306:localhost:3306 user@192.168.1.10 # 然后连接本地 3306 端口 mysql -h 127.0.0.1 -u myuser -p ``` **优点:** - 数据通过 SSH 加密传输 - 不需要开放 MySQL 端口 - 最安全的远程访问方式 --- #### 方法 2:修改默认端口 ```bash # 编辑配置文件 sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf # 添加或修改 port = 33060 # 重启服务 sudo systemctl restart mysql ``` **说明:** - 修改默认端口可以减少自动化扫描攻击 - 但这只是"隐蔽性安全",不能替代真正的安全措施 --- #### 方法 3:限制连接数和超时 ```sql -- 限制单个用户的最大连接数 ALTER USER 'myuser'@'%' WITH MAX_USER_CONNECTIONS 5; -- 查看当前连接 SHOW PROCESSLIST; ``` --- ## 八、安全配置总结 ### ✅ 推荐的安全配置(按优先级) 1. **禁止 root 远程登录**(必须) ```sql -- root 只允许本地访问 DELETE FROM mysql.user WHERE user='root' AND host!='localhost'; FLUSH PRIVILEGES; ``` 2. **创建专用用户**(必须) - 为每个应用创建独立用户 - 只授予必要的权限 - 使用强密码 3. **限制访问来源**(强烈推荐) - 优先使用 `localhost` - 其次使用特定 IP - 避免使用 `%`(任意 IP) 4. **配置防火墙**(强烈推荐) - 只允许可信 IP 访问 3306 端口 - 定期审查防火墙规则 5. **使用 SSH 隧道**(推荐) - 远程访问时优先使用 SSH 隧道 - 避免直接暴露 MySQL 端口 6. **定期更新**(推荐) ```bash sudo apt update sudo apt upgrade mysql-server ``` --- ### ❌ 危险的配置(切勿使用) ```sql -- ❌ 允许 root 从任意 IP 登录 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password'; -- ❌ 创建无密码用户 CREATE USER 'user'@'%'; -- ❌ 授予所有数据库的所有权限 GRANT ALL PRIVILEGES ON *.* TO 'user'@'%'; ``` **配置文件中:** ``` # ❌ 不验证密码强度 validate_password.policy = LOW # ❌ 跳过权限验证(仅用于紧急恢复) skip-grant-tables ``` --- ## 九、下一步学习建议 1. **学习基本 SQL 语句**:CREATE、INSERT、SELECT、UPDATE、DELETE 2. **了解数据库设计**:表结构、主键、外键、索引 3. **学习备份与恢复**:mysqldump 命令 4. **性能优化**:慢查询日志、索引优化 5. **监控和日志**:错误日志、二进制日志 --- ## 附录:快速参考 ### 安装命令(一键复制) ```bash sudo apt update sudo apt install mysql-server -y sudo systemctl status mysql mysql --version sudo mysql_secure_installation ``` ### 安全配置推荐答案 ``` 启用密码验证插件:Y 密码强度等级:1 (MEDIUM) 设置 root 密码:[输入你的强密码] 移除匿名用户:Y 禁止 root 远程登录:Y 删除测试数据库:Y 刷新权限表:Y ``` --- **教程完成!祝你学习愉快!** 🎉 如有问题,请检查: 1. 是否使用了 `sudo` 权限 2. 网络连接是否正常 3. 系统是否为 Ubuntu/Debian 系列 4. 磁盘空间是否充足