前言
MySQL作为目前最流行的关系型数据库管理系统之一,广泛应用于各类Web应用和企业级系统中。本文将带领MySQL新手从零开始,在Linux环境下快速掌握MySQL的核心概念和基本操作,帮助大家在实际开发中熟练运用MySQL数据库。
一、MySQL基础概念
1.1 什么是MySQL?
MySQL是一个开源的关系型数据库管理系统(RDBMS),由瑞典MySQL AB公司开发,现在隶属于Oracle公司。它使用SQL(结构化查询语言)作为操作语言,具有性能优异、稳定可靠、使用简单等特点。
1.2 核心概念
- 数据库(Database):数据的集合,用于存储和管理相关数据
- 表(Table):数据库中的基本数据存储单位,由行和列组成
- 行(Row):表中的一条完整记录
- 列(Column):表中的一个字段,定义了数据的类型和属性
- 主键(Primary Key):唯一标识表中每条记录的字段
- SQL:结构化查询语言,用于操作数据库的标准语言
二、MySQL安装配置(Linux环境)
2.1 CentOS环境安装
方法一:使用YUM包管理器安装
-
下载并安装MySQL官方YUM仓库
wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm sudo rpm -ivh mysql80-community-release-el7-3.noarch.rpm
-
安装MySQL服务器
sudo yum install mysql-community-server
-
启动MySQL服务
sudo systemctl start mysqld
-
设置开机自启
sudo systemctl enable mysqld
-
查看初始密码
sudo grep 'temporary password' /var/log/mysqld.log
方法二:使用官方二进制包安装
-
下载MySQL二进制包
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.33-linux-glibc2.12-x86_64.tar.gz
-
解压并移动到合适位置
tar -zxvf mysql-8.0.33-linux-glibc2.12-x86_64.tar.gz sudo mv mysql-8.0.33-linux-glibc2.12-x86_64 /usr/local/mysql
-
创建MySQL用户和组
sudo groupadd mysql sudo useradd -r -g mysql -s /bin/false mysql
-
创建数据目录并设置权限
sudo mkdir /usr/local/mysql/data sudo chown -R mysql:mysql /usr/local/mysql
-
初始化数据库
cd /usr/local/mysql sudo bin/mysqld --initialize --user=mysql
2.2 Ubuntu环境安装
方法一:使用APT包管理器安装
-
更新包列表
sudo apt update
-
安装MySQL服务器
sudo apt install mysql-server
-
启动MySQL服务
sudo systemctl start mysql
-
设置开机自启
sudo systemctl enable mysql
方法二:使用官方二进制包安装
-
下载MySQL二进制包
wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.33-linux-glibc2.12-x86_64.tar.gz
-
解压并移动到合适位置
tar -zxvf mysql-8.0.33-linux-glibc2.12-x86_64.tar.gz sudo mv mysql-8.0.33-linux-glibc2.12-x86_64 /usr/local/mysql
-
创建MySQL用户和组
sudo groupadd mysql sudo useradd -r -g mysql -s /bin/false mysql
-
创建数据目录并设置权限
sudo mkdir /usr/local/mysql/data sudo chown -R mysql:mysql /usr/local/mysql
-
初始化数据库
cd /usr/local/mysql sudo bin/mysqld --initialize --user=mysql
三、数据库初始化
3.1 运行安全配置脚本
sudo mysql_secure_installation
该脚本会引导你完成以下配置:
-
设置密码验证策略
Securing the MySQL server deployment. Connecting to MySQL using a blank password. VALIDATE PASSWORD COMPONENT can be used to test passwords and improve security. It checks the strength of password and allows the users to set only those passwords which are secure enough. Would you like to setup VALIDATE PASSWORD component? Press y|Y for Yes, any other key for No: y
-
设置root密码
Please set the password for root here. New password: Re-enter new password:
-
移除匿名用户
By default, a MySQL installation has an anonymous user, allowing anyone to log into MySQL without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. Remove anonymous users? (Press y|Y for Yes, any other key for No) : y
-
禁止root远程登录
Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y
-
删除测试数据库
By default, MySQL comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y
-
重新加载权限表
Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y
3.2 环境变量配置
-
编辑bash配置文件
nano ~/.bashrc
-
添加MySQL路径
export MYSQL_HOME=/usr/local/mysql export PATH=$PATH:$MYSQL_HOME/bin
-
使配置生效
source ~/.bashrc
-
验证配置
mysql --version
四、常用登录命令
4.1 本地登录
基本登录
mysql -u 用户名 -p
示例:
mysql -u root -p
指定端口登录
mysql -u 用户名 -p -P 端口号
示例:
mysql -u root -p -P 3306
指定socket文件登录
mysql -u 用户名 -p -S socket文件路径
示例:
mysql -u root -p -S /var/lib/mysql/mysql.sock
直接输入密码登录(不推荐,密码会显示在历史记录中)
mysql -u 用户名 -p密码
示例:
mysql -u root -p123456
4.2 远程登录
基本远程登录
mysql -h 主机地址 -u 用户名 -p
示例:
mysql -h 192.168.1.100 -u root -p
指定端口远程登录
mysql -h 主机地址 -P 端口号 -u 用户名 -p
示例:
mysql -h 192.168.1.100 -P 3306 -u root -p
使用域名远程登录
mysql -h 域名 -u 用户名 -p
示例:
mysql -h db.example.com -u root -p
4.3 登录后常用命令
查看当前用户
SELECT USER();
查看当前数据库
SELECT DATABASE();
查看MySQL版本
SELECT VERSION();
查看所有数据库
SHOW DATABASES;
退出MySQL
EXIT;
-- 或者
QUIT;
五、常用建库命令
5.1 创建基本数据库
创建简单数据库
CREATE DATABASE 数据库名;
示例:
CREATE DATABASE myapp;
创建数据库时指定字符集
CREATE DATABASE 数据库名 CHARACTER SET 字符集;
示例:
CREATE DATABASE myapp CHARACTER SET utf8mb4;
创建数据库时指定字符集和排序规则
CREATE DATABASE 数据库名 CHARACTER SET 字符集 COLLATE 排序规则;
示例:
CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
5.2 创建高级数据库
创建数据库时指定存储引擎
CREATE DATABASE 数据库名 DEFAULT CHARACTER SET 字符集 DEFAULT COLLATE 排序规则;
示例:
CREATE DATABASE myapp DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;
创建数据库时设置权限
CREATE DATABASE 数据库名;
GRANT ALL PRIVILEGES ON 数据库名.* TO '用户名'@'主机' IDENTIFIED BY '密码';
FLUSH PRIVILEGES;
示例:
CREATE DATABASE myapp;
GRANT ALL PRIVILEGES ON myapp.* TO 'appuser'@'localhost' IDENTIFIED BY 'app123';
FLUSH PRIVILEGES;
5.3 查看数据库信息
查看所有数据库
SHOW DATABASES;
查看数据库创建语句
SHOW CREATE DATABASE 数据库名;
示例:
SHOW CREATE DATABASE myapp;
查看数据库字符集信息
SELECT * FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '数据库名';
示例:
SELECT * FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = 'myapp';
5.4 选择和删除数据库
选择数据库
USE 数据库名;
示例:
USE myapp;
删除数据库
DROP DATABASE 数据库名;
示例:
DROP DATABASE myapp;
删除数据库前检查是否存在
DROP DATABASE IF EXISTS 数据库名;
示例:
DROP DATABASE IF EXISTS myapp;
六、其他常用操作命令
6.1 表操作命令
创建表
CREATE TABLE 表名 (
字段名1 数据类型 [约束条件],
字段名2 数据类型 [约束条件],
...
[PRIMARY KEY (主键字段)]
);
示例:
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(100) NOT NULL,
email VARCHAR(100),
age INT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
查看表结构
DESCRIBE 表名;
-- 或者
DESC 表名;
示例:
DESCRIBE users;
查看所有表
SHOW TABLES;
修改表结构
-- 添加字段
ALTER TABLE 表名 ADD 字段名 数据类型 [约束];
-- 修改字段
ALTER TABLE 表名 MODIFY 字段名 新数据类型 [新约束];
-- 删除字段
ALTER TABLE 表名 DROP 字段名;
-- 修改表名
ALTER TABLE 旧表名 RENAME TO 新表名;
示例:
-- 添加电话字段
ALTER TABLE users ADD phone VARCHAR(20);
-- 修改电话字段长度
ALTER TABLE users MODIFY phone VARCHAR(30);
-- 删除电话字段
ALTER TABLE users DROP phone;
-- 修改表名
ALTER TABLE users RENAME TO user_info;
删除表
DROP TABLE 表名;
示例:
DROP TABLE users;
6.2 数据操作命令
插入数据
INSERT INTO 表名 (字段1, 字段2, ...) VALUES (值1, 值2, ...);
示例:
-- 插入单条数据
INSERT INTO users (username, password, email, age)
VALUES ('zhangsan', '123456', 'zhangsan@example.com', 25);
-- 插入多条数据
INSERT INTO users (username, password, email, age) VALUES
('lisi', '123456', 'lisi@example.com', 30),
('wangwu', '123456', 'wangwu@example.com', 28);
查询数据
SELECT 字段1, 字段2, ... FROM 表名 [WHERE 条件] [ORDER BY 排序字段] [LIMIT 限制];
示例:
-- 查询所有数据
SELECT * FROM users;
-- 查询指定字段
SELECT username, email FROM users;
-- 条件查询
SELECT * FROM users WHERE age > 25;
-- 排序查询
SELECT * FROM users ORDER BY age DESC;
-- 分页查询
SELECT * FROM users LIMIT 0, 10;
更新数据
UPDATE 表名 SET 字段1 = 新值1, 字段2 = 新值2, ... [WHERE 条件];
示例:
-- 更新单条记录
UPDATE users SET age = 26 WHERE username = 'zhangsan';
-- 更新多条记录
UPDATE users SET password = 'newpassword' WHERE age > 25;
删除数据
DELETE FROM 表名 [WHERE 条件];
示例:
-- 删除指定记录
DELETE FROM users WHERE username = 'zhangsan';
-- 删除多条记录
DELETE FROM users WHERE age < 20;
6.3 用户和权限管理
创建用户
CREATE USER '用户名'@'主机' IDENTIFIED BY '密码';
示例:
-- 创建本地用户
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'app123';
-- 创建远程用户
CREATE USER 'appuser'@'%' IDENTIFIED BY 'app123';
授权
GRANT 权限 ON 数据库.表 TO '用户名'@'主机';
示例:
-- 授予所有权限
GRANT ALL PRIVILEGES ON myapp.* TO 'appuser'@'localhost';
-- 授予指定权限
GRANT SELECT, INSERT, UPDATE ON myapp.* TO 'appuser'@'localhost';
-- 授予远程访问权限
GRANT ALL PRIVILEGES ON *.* TO 'appuser'@'%';
撤销权限
REVOKE 权限 ON 数据库.表 FROM '用户名'@'主机';
示例:
REVOKE DELETE ON myapp.* FROM 'appuser'@'localhost';
删除用户
DROP USER '用户名'@'主机';
示例:
DROP USER 'appuser'@'localhost';
刷新权限
FLUSH PRIVILEGES;
6.4 备份和恢复
备份数据库
mysqldump -u 用户名 -p 数据库名 > 备份文件.sql
示例:
mysqldump -u root -p myapp > myapp_backup.sql
备份多个数据库
mysqldump -u 用户名 -p --databases 数据库1 数据库2 > 备份文件.sql
示例:
mysqldump -u root -p --databases myapp myapp2 > apps_backup.sql
备份所有数据库
mysqldump -u 用户名 -p --all-databases > all_backup.sql
恢复数据库
mysql -u 用户名 -p 数据库名 < 备份文件.sql
示例:
mysql -u root -p myapp < myapp_backup.sql
七、常见问题处理
7.1 MySQL服务无法启动
问题现象
sudo systemctl start mysql
Job for mysql.service failed because the control process exited with error code.
See "systemctl status mysql.service" and "journalctl -xe" for details.
解决方案
-
检查MySQL日志
sudo tail -f /var/log/mysql/error.log
-
检查磁盘空间
df -h
-
检查权限
sudo chown -R mysql:mysql /var/lib/mysql sudo chmod -R 755 /var/lib/mysql
-
检查配置文件
sudo mysqld --help --verbose | grep "Default options"
-
重新初始化数据库
sudo systemctl stop mysql sudo rm -rf /var/lib/mysql/* sudo mysqld --initialize --user=mysql sudo systemctl start mysql
7.2 连接MySQL时出现Access denied
问题现象
mysql -u root -p
Enter password:
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
解决方案
-
检查用户名和密码是否正确
-
重置root密码(见下文root密码找回)
-
检查用户权限
SELECT user, host FROM mysql.user;
-
创建新的root用户
CREATE USER 'root'@'localhost' IDENTIFIED BY '新密码'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES;
7.3 中文乱码问题
问题现象
插入或查询中文数据时显示为问号或乱码。
解决方案
-
检查当前字符集
SHOW VARIABLES LIKE 'character%';
-
修改MySQL配置文件
sudo nano /etc/my.cnf
添加以下内容:
[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci [client] default-character-set=utf8mb4 [mysql] default-character-set=utf8mb4
-
重启MySQL服务
sudo systemctl restart mysql
-
创建数据库时指定字符集
CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-
修改现有数据库字符集
ALTER DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
7.4 磁盘空间不足
问题现象
MySQL服务运行缓慢或无法启动,系统提示磁盘空间不足。
解决方案
-
清理MySQL日志
RESET MASTER; RESET SLAVE;
-
清理二进制日志
PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);
-
优化表
OPTIMIZE TABLE 表名;
-
清理临时文件
sudo rm -rf /tmp/mysql*
-
扩展磁盘空间或清理系统文件
7.5 连接数过多
问题现象
ERROR 1040 (HY000): Too many connections
解决方案
-
查看当前连接数
SHOW STATUS LIKE 'Threads_connected';
-
查看最大连接数
SHOW VARIABLES LIKE 'max_connections';
-
临时增加连接数
SET GLOBAL max_connections = 1000;
-
永久修改连接数
sudo nano /etc/my.cnf
添加:
[mysqld] max_connections = 1000
-
重启MySQL服务
sudo systemctl restart mysql
八、root密码找回
8.1 方法一:跳过权限表方式
步骤1:停止MySQL服务
sudo systemctl stop mysql
步骤2:以跳过权限表方式启动MySQL
sudo mysqld_safe --skip-grant-tables &
步骤3:无密码登录MySQL
mysql -u root
步骤4:修改root密码
-- MySQL 5.7及以下版本
UPDATE mysql.user SET password=PASSWORD('新密码') WHERE User='root';
-- MySQL 8.0及以上版本
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
步骤5:刷新权限
FLUSH PRIVILEGES;
步骤6:退出MySQL
EXIT;
步骤7:重启MySQL服务
sudo systemctl restart mysql
步骤8:使用新密码登录
mysql -u root -p
8.2 方法二:使用init-file方式
步骤1:停止MySQL服务
sudo systemctl stop mysql
步骤2:创建密码重置文件
echo "ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';" > /tmp/reset_pwd.sql
步骤3:使用init-file启动MySQL
sudo mysqld --init-file=/tmp/reset_pwd.sql &
步骤4:等待几秒后停止MySQL
sudo systemctl stop mysql
步骤5:正常启动MySQL服务
sudo systemctl start mysql
步骤6:使用新密码登录
mysql -u root -p
步骤7:删除临时文件
rm -f /tmp/reset_pwd.sql
8.3 方法三:使用mysql_secure_installation
步骤1:停止MySQL服务
sudo systemctl stop mysql
步骤2:删除MySQL数据目录
sudo rm -rf /var/lib/mysql/*
步骤3:重新初始化数据库
sudo mysqld --initialize --user=mysql
步骤4:启动MySQL服务
sudo systemctl start mysql
步骤5:获取临时密码
sudo grep 'temporary password' /var/log/mysqld.log
步骤6:使用临时密码登录
mysql -u root -p
步骤7:运行安全配置脚本
sudo mysql_secure_installation
按照提示设置新的root密码。
九、总结
9.1 最佳实践建议
- 定期备份:重要数据要定期备份,建议设置自动备份脚本
- 权限管理:为不同应用创建独立的数据库用户,避免使用root用户
- 字符集设置:统一使用utf8mb4字符集,避免中文乱码问题
- 监控日志:定期检查MySQL错误日志,及时发现和解决问题
- 性能优化:根据实际需求调整MySQL配置参数,优化性能
9.2 下一步学习建议
- 索引优化:学习如何创建和使用索引提高查询性能
- 主从复制:了解MySQL主从复制架构,实现高可用
- 性能调优:学习MySQL性能监控和调优技巧
- 安全加固:学习MySQL安全配置和防护措施
- 云数据库:了解云平台上的MySQL服务使用
MySQL的学习是一个循序渐进的过程,持续练习和项目实践是掌握它的最佳方式。希望这篇教程能够帮助你快速入门MySQL。