MySQL快速上手——常用命令及问题整理

前言

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包管理器安装
  1. 下载并安装MySQL官方YUM仓库

    bash 复制代码
    wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
    sudo rpm -ivh mysql80-community-release-el7-3.noarch.rpm
  2. 安装MySQL服务器

    bash 复制代码
    sudo yum install mysql-community-server
  3. 启动MySQL服务

    bash 复制代码
    sudo systemctl start mysqld
  4. 设置开机自启

    bash 复制代码
    sudo systemctl enable mysqld
  5. 查看初始密码

    bash 复制代码
    sudo grep 'temporary password' /var/log/mysqld.log
方法二:使用官方二进制包安装
  1. 下载MySQL二进制包

    bash 复制代码
    wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.33-linux-glibc2.12-x86_64.tar.gz
  2. 解压并移动到合适位置

    bash 复制代码
    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
  3. 创建MySQL用户和组

    bash 复制代码
    sudo groupadd mysql
    sudo useradd -r -g mysql -s /bin/false mysql
  4. 创建数据目录并设置权限

    bash 复制代码
    sudo mkdir /usr/local/mysql/data
    sudo chown -R mysql:mysql /usr/local/mysql
  5. 初始化数据库

    bash 复制代码
    cd /usr/local/mysql
    sudo bin/mysqld --initialize --user=mysql

2.2 Ubuntu环境安装

方法一:使用APT包管理器安装
  1. 更新包列表

    bash 复制代码
    sudo apt update
  2. 安装MySQL服务器

    bash 复制代码
    sudo apt install mysql-server
  3. 启动MySQL服务

    bash 复制代码
    sudo systemctl start mysql
  4. 设置开机自启

    bash 复制代码
    sudo systemctl enable mysql
方法二:使用官方二进制包安装
  1. 下载MySQL二进制包

    bash 复制代码
    wget https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.33-linux-glibc2.12-x86_64.tar.gz
  2. 解压并移动到合适位置

    bash 复制代码
    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
  3. 创建MySQL用户和组

    bash 复制代码
    sudo groupadd mysql
    sudo useradd -r -g mysql -s /bin/false mysql
  4. 创建数据目录并设置权限

    bash 复制代码
    sudo mkdir /usr/local/mysql/data
    sudo chown -R mysql:mysql /usr/local/mysql
  5. 初始化数据库

    bash 复制代码
    cd /usr/local/mysql
    sudo bin/mysqld --initialize --user=mysql

三、数据库初始化

3.1 运行安全配置脚本

bash 复制代码
sudo mysql_secure_installation

该脚本会引导你完成以下配置:

  1. 设置密码验证策略

    复制代码
    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
  2. 设置root密码

    复制代码
    Please set the password for root here.
    
    New password:
    
    Re-enter new password:
  3. 移除匿名用户

    复制代码
    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
  4. 禁止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
  5. 删除测试数据库

    复制代码
    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
  6. 重新加载权限表

    复制代码
    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 环境变量配置

  1. 编辑bash配置文件

    bash 复制代码
    nano ~/.bashrc
  2. 添加MySQL路径

    bash 复制代码
    export MYSQL_HOME=/usr/local/mysql
    export PATH=$PATH:$MYSQL_HOME/bin
  3. 使配置生效

    bash 复制代码
    source ~/.bashrc
  4. 验证配置

    bash 复制代码
    mysql --version

四、常用登录命令

4.1 本地登录

基本登录
bash 复制代码
mysql -u 用户名 -p

示例:

bash 复制代码
mysql -u root -p
指定端口登录
bash 复制代码
mysql -u 用户名 -p -P 端口号

示例:

bash 复制代码
mysql -u root -p -P 3306
指定socket文件登录
bash 复制代码
mysql -u 用户名 -p -S socket文件路径

示例:

bash 复制代码
mysql -u root -p -S /var/lib/mysql/mysql.sock
直接输入密码登录(不推荐,密码会显示在历史记录中)
bash 复制代码
mysql -u 用户名 -p密码

示例:

bash 复制代码
mysql -u root -p123456

4.2 远程登录

基本远程登录
bash 复制代码
mysql -h 主机地址 -u 用户名 -p

示例:

bash 复制代码
mysql -h 192.168.1.100 -u root -p
指定端口远程登录
bash 复制代码
mysql -h 主机地址 -P 端口号 -u 用户名 -p

示例:

bash 复制代码
mysql -h 192.168.1.100 -P 3306 -u root -p
使用域名远程登录
bash 复制代码
mysql -h 域名 -u 用户名 -p

示例:

bash 复制代码
mysql -h db.example.com -u root -p

4.3 登录后常用命令

查看当前用户
sql 复制代码
SELECT USER();
查看当前数据库
sql 复制代码
SELECT DATABASE();
查看MySQL版本
sql 复制代码
SELECT VERSION();
查看所有数据库
sql 复制代码
SHOW DATABASES;
退出MySQL
sql 复制代码
EXIT;
-- 或者
QUIT;

五、常用建库命令

5.1 创建基本数据库

创建简单数据库
sql 复制代码
CREATE DATABASE 数据库名;

示例:

sql 复制代码
CREATE DATABASE myapp;
创建数据库时指定字符集
sql 复制代码
CREATE DATABASE 数据库名 CHARACTER SET 字符集;

示例:

sql 复制代码
CREATE DATABASE myapp CHARACTER SET utf8mb4;
创建数据库时指定字符集和排序规则
sql 复制代码
CREATE DATABASE 数据库名 CHARACTER SET 字符集 COLLATE 排序规则;

示例:

sql 复制代码
CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

5.2 创建高级数据库

创建数据库时指定存储引擎
sql 复制代码
CREATE DATABASE 数据库名 DEFAULT CHARACTER SET 字符集 DEFAULT COLLATE 排序规则;

示例:

sql 复制代码
CREATE DATABASE myapp DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;
创建数据库时设置权限
sql 复制代码
CREATE DATABASE 数据库名;
GRANT ALL PRIVILEGES ON 数据库名.* TO '用户名'@'主机' IDENTIFIED BY '密码';
FLUSH PRIVILEGES;

示例:

sql 复制代码
CREATE DATABASE myapp;
GRANT ALL PRIVILEGES ON myapp.* TO 'appuser'@'localhost' IDENTIFIED BY 'app123';
FLUSH PRIVILEGES;

5.3 查看数据库信息

查看所有数据库
sql 复制代码
SHOW DATABASES;
查看数据库创建语句
sql 复制代码
SHOW CREATE DATABASE 数据库名;

示例:

sql 复制代码
SHOW CREATE DATABASE myapp;
查看数据库字符集信息
sql 复制代码
SELECT * FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = '数据库名';

示例:

sql 复制代码
SELECT * FROM information_schema.SCHEMATA WHERE SCHEMA_NAME = 'myapp';

5.4 选择和删除数据库

选择数据库
sql 复制代码
USE 数据库名;

示例:

sql 复制代码
USE myapp;
删除数据库
sql 复制代码
DROP DATABASE 数据库名;

示例:

sql 复制代码
DROP DATABASE myapp;
删除数据库前检查是否存在
sql 复制代码
DROP DATABASE IF EXISTS 数据库名;

示例:

sql 复制代码
DROP DATABASE IF EXISTS myapp;

六、其他常用操作命令

6.1 表操作命令

创建表
sql 复制代码
CREATE TABLE 表名 (
    字段名1 数据类型 [约束条件],
    字段名2 数据类型 [约束条件],
    ...
    [PRIMARY KEY (主键字段)]
);

示例:

sql 复制代码
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
);
查看表结构
sql 复制代码
DESCRIBE 表名;
-- 或者
DESC 表名;

示例:

sql 复制代码
DESCRIBE users;
查看所有表
sql 复制代码
SHOW TABLES;
修改表结构
sql 复制代码
-- 添加字段
ALTER TABLE 表名 ADD 字段名 数据类型 [约束];

-- 修改字段
ALTER TABLE 表名 MODIFY 字段名 新数据类型 [新约束];

-- 删除字段
ALTER TABLE 表名 DROP 字段名;

-- 修改表名
ALTER TABLE 旧表名 RENAME TO 新表名;

示例:

sql 复制代码
-- 添加电话字段
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;
删除表
sql 复制代码
DROP TABLE 表名;

示例:

sql 复制代码
DROP TABLE users;

6.2 数据操作命令

插入数据
sql 复制代码
INSERT INTO 表名 (字段1, 字段2, ...) VALUES (值1, 值2, ...);

示例:

sql 复制代码
-- 插入单条数据
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);
查询数据
sql 复制代码
SELECT 字段1, 字段2, ... FROM 表名 [WHERE 条件] [ORDER BY 排序字段] [LIMIT 限制];

示例:

sql 复制代码
-- 查询所有数据
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;
更新数据
sql 复制代码
UPDATE 表名 SET 字段1 = 新值1, 字段2 = 新值2, ... [WHERE 条件];

示例:

sql 复制代码
-- 更新单条记录
UPDATE users SET age = 26 WHERE username = 'zhangsan';

-- 更新多条记录
UPDATE users SET password = 'newpassword' WHERE age > 25;
删除数据
sql 复制代码
DELETE FROM 表名 [WHERE 条件];

示例:

sql 复制代码
-- 删除指定记录
DELETE FROM users WHERE username = 'zhangsan';

-- 删除多条记录
DELETE FROM users WHERE age < 20;

6.3 用户和权限管理

创建用户
sql 复制代码
CREATE USER '用户名'@'主机' IDENTIFIED BY '密码';

示例:

sql 复制代码
-- 创建本地用户
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'app123';

-- 创建远程用户
CREATE USER 'appuser'@'%' IDENTIFIED BY 'app123';
授权
sql 复制代码
GRANT 权限 ON 数据库.表 TO '用户名'@'主机';

示例:

sql 复制代码
-- 授予所有权限
GRANT ALL PRIVILEGES ON myapp.* TO 'appuser'@'localhost';

-- 授予指定权限
GRANT SELECT, INSERT, UPDATE ON myapp.* TO 'appuser'@'localhost';

-- 授予远程访问权限
GRANT ALL PRIVILEGES ON *.* TO 'appuser'@'%';
撤销权限
sql 复制代码
REVOKE 权限 ON 数据库.表 FROM '用户名'@'主机';

示例:

sql 复制代码
REVOKE DELETE ON myapp.* FROM 'appuser'@'localhost';
删除用户
sql 复制代码
DROP USER '用户名'@'主机';

示例:

sql 复制代码
DROP USER 'appuser'@'localhost';
刷新权限
sql 复制代码
FLUSH PRIVILEGES;

6.4 备份和恢复

备份数据库
bash 复制代码
mysqldump -u 用户名 -p 数据库名 > 备份文件.sql

示例:

bash 复制代码
mysqldump -u root -p myapp > myapp_backup.sql
备份多个数据库
bash 复制代码
mysqldump -u 用户名 -p --databases 数据库1 数据库2 > 备份文件.sql

示例:

bash 复制代码
mysqldump -u root -p --databases myapp myapp2 > apps_backup.sql
备份所有数据库
bash 复制代码
mysqldump -u 用户名 -p --all-databases > all_backup.sql
恢复数据库
bash 复制代码
mysql -u 用户名 -p 数据库名 < 备份文件.sql

示例:

bash 复制代码
mysql -u root -p myapp < myapp_backup.sql

七、常见问题处理

7.1 MySQL服务无法启动

问题现象
bash 复制代码
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.
解决方案
  1. 检查MySQL日志

    bash 复制代码
    sudo tail -f /var/log/mysql/error.log
  2. 检查磁盘空间

    bash 复制代码
    df -h
  3. 检查权限

    bash 复制代码
    sudo chown -R mysql:mysql /var/lib/mysql
    sudo chmod -R 755 /var/lib/mysql
  4. 检查配置文件

    bash 复制代码
    sudo mysqld --help --verbose | grep "Default options"
  5. 重新初始化数据库

    bash 复制代码
    sudo systemctl stop mysql
    sudo rm -rf /var/lib/mysql/*
    sudo mysqld --initialize --user=mysql
    sudo systemctl start mysql

7.2 连接MySQL时出现Access denied

问题现象
bash 复制代码
mysql -u root -p
Enter password: 
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
解决方案
  1. 检查用户名和密码是否正确

  2. 重置root密码(见下文root密码找回)

  3. 检查用户权限

    sql 复制代码
    SELECT user, host FROM mysql.user;
  4. 创建新的root用户

    sql 复制代码
    CREATE USER 'root'@'localhost' IDENTIFIED BY '新密码';
    GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION;
    FLUSH PRIVILEGES;

7.3 中文乱码问题

问题现象

插入或查询中文数据时显示为问号或乱码。

解决方案
  1. 检查当前字符集

    sql 复制代码
    SHOW VARIABLES LIKE 'character%';
  2. 修改MySQL配置文件

    bash 复制代码
    sudo nano /etc/my.cnf

    添加以下内容:

    ini 复制代码
    [mysqld]
    character-set-server=utf8mb4
    collation-server=utf8mb4_unicode_ci
    
    [client]
    default-character-set=utf8mb4
    
    [mysql]
    default-character-set=utf8mb4
  3. 重启MySQL服务

    bash 复制代码
    sudo systemctl restart mysql
  4. 创建数据库时指定字符集

    sql 复制代码
    CREATE DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  5. 修改现有数据库字符集

    sql 复制代码
    ALTER DATABASE myapp CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

7.4 磁盘空间不足

问题现象

MySQL服务运行缓慢或无法启动,系统提示磁盘空间不足。

解决方案
  1. 清理MySQL日志

    sql 复制代码
    RESET MASTER;
    RESET SLAVE;
  2. 清理二进制日志

    sql 复制代码
    PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);
  3. 优化表

    sql 复制代码
    OPTIMIZE TABLE 表名;
  4. 清理临时文件

    bash 复制代码
    sudo rm -rf /tmp/mysql*
  5. 扩展磁盘空间或清理系统文件

7.5 连接数过多

问题现象
sql 复制代码
ERROR 1040 (HY000): Too many connections
解决方案
  1. 查看当前连接数

    sql 复制代码
    SHOW STATUS LIKE 'Threads_connected';
  2. 查看最大连接数

    sql 复制代码
    SHOW VARIABLES LIKE 'max_connections';
  3. 临时增加连接数

    sql 复制代码
    SET GLOBAL max_connections = 1000;
  4. 永久修改连接数

    bash 复制代码
    sudo nano /etc/my.cnf

    添加:

    ini 复制代码
    [mysqld]
    max_connections = 1000
  5. 重启MySQL服务

    bash 复制代码
    sudo systemctl restart mysql

八、root密码找回

8.1 方法一:跳过权限表方式

步骤1:停止MySQL服务
bash 复制代码
sudo systemctl stop mysql
步骤2:以跳过权限表方式启动MySQL
bash 复制代码
sudo mysqld_safe --skip-grant-tables &
步骤3:无密码登录MySQL
bash 复制代码
mysql -u root
步骤4:修改root密码
sql 复制代码
-- MySQL 5.7及以下版本
UPDATE mysql.user SET password=PASSWORD('新密码') WHERE User='root';

-- MySQL 8.0及以上版本
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
步骤5:刷新权限
sql 复制代码
FLUSH PRIVILEGES;
步骤6:退出MySQL
sql 复制代码
EXIT;
步骤7:重启MySQL服务
bash 复制代码
sudo systemctl restart mysql
步骤8:使用新密码登录
bash 复制代码
mysql -u root -p

8.2 方法二:使用init-file方式

步骤1:停止MySQL服务
bash 复制代码
sudo systemctl stop mysql
步骤2:创建密码重置文件
bash 复制代码
echo "ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';" > /tmp/reset_pwd.sql
步骤3:使用init-file启动MySQL
bash 复制代码
sudo mysqld --init-file=/tmp/reset_pwd.sql &
步骤4:等待几秒后停止MySQL
bash 复制代码
sudo systemctl stop mysql
步骤5:正常启动MySQL服务
bash 复制代码
sudo systemctl start mysql
步骤6:使用新密码登录
bash 复制代码
mysql -u root -p
步骤7:删除临时文件
bash 复制代码
rm -f /tmp/reset_pwd.sql

8.3 方法三:使用mysql_secure_installation

步骤1:停止MySQL服务
bash 复制代码
sudo systemctl stop mysql
步骤2:删除MySQL数据目录
bash 复制代码
sudo rm -rf /var/lib/mysql/*
步骤3:重新初始化数据库
bash 复制代码
sudo mysqld --initialize --user=mysql
步骤4:启动MySQL服务
bash 复制代码
sudo systemctl start mysql
步骤5:获取临时密码
bash 复制代码
sudo grep 'temporary password' /var/log/mysqld.log
步骤6:使用临时密码登录
bash 复制代码
mysql -u root -p
步骤7:运行安全配置脚本
bash 复制代码
sudo mysql_secure_installation

按照提示设置新的root密码。

九、总结

9.1 最佳实践建议

  1. 定期备份:重要数据要定期备份,建议设置自动备份脚本
  2. 权限管理:为不同应用创建独立的数据库用户,避免使用root用户
  3. 字符集设置:统一使用utf8mb4字符集,避免中文乱码问题
  4. 监控日志:定期检查MySQL错误日志,及时发现和解决问题
  5. 性能优化:根据实际需求调整MySQL配置参数,优化性能

9.2 下一步学习建议

  1. 索引优化:学习如何创建和使用索引提高查询性能
  2. 主从复制:了解MySQL主从复制架构,实现高可用
  3. 性能调优:学习MySQL性能监控和调优技巧
  4. 安全加固:学习MySQL安全配置和防护措施
  5. 云数据库:了解云平台上的MySQL服务使用

MySQL的学习是一个循序渐进的过程,持续练习和项目实践是掌握它的最佳方式。希望这篇教程能够帮助你快速入门MySQL。