Skip to content

MySQL 常用命令

连接与断开命令

连接数据库

基本连接

bash
mysql -u root -p

指定主机和端口连接

bash
mysql -h hostname -P port -u username -p

使用套接字文件连接

bash
mysql -S /path/to/mysql.sock -u username -p

连接到指定数据库

bash
mysql -u username -p database_name

执行单条SQL命令

bash
mysql -u username -p -e "SELECT * FROM table_name"

断开连接

sql
EXIT;
-- 或
QUIT;
-- 或使用快捷键 Ctrl+D

数据库管理命令

创建数据库

基本创建

sql
CREATE DATABASE database_name;

指定字符集和排序规则创建

sql
CREATE DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

创建数据库(如果不存在)

sql
CREATE DATABASE IF NOT EXISTS database_name;

查看数据库

查看所有数据库

sql
SHOW DATABASES;

查看当前数据库

sql
SELECT DATABASE();
-- 或
SELECT schema_name FROM information_schema.schemata WHERE schema_name = DATABASE();

查看数据库创建语句

sql
SHOW CREATE DATABASE database_name;

切换数据库

sql
USE database_name;

修改数据库

修改字符集和排序规则

sql
ALTER DATABASE database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

修改数据库名称(MySQL 5.1.7+)

sql
ALTER DATABASE old_name RENAME TO new_name;
-- 或使用 RENAME DATABASE(不推荐,可能导致数据丢失)

删除数据库

基本删除

sql
DROP DATABASE database_name;

删除数据库(如果存在)

sql
DROP DATABASE IF EXISTS database_name;

表管理命令

创建表

基本创建

sql
CREATE TABLE table_name (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    age INT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

创建表(如果不存在)

sql
CREATE TABLE IF NOT EXISTS table_name (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL
);

复制表结构

sql
CREATE TABLE new_table LIKE existing_table;

复制表结构和数据

sql
CREATE TABLE new_table AS SELECT * FROM existing_table;

查看表

查看当前数据库的所有表

sql
SHOW TABLES;

查看表结构

sql
DESCRIBE table_name;
-- 或
SHOW COLUMNS FROM table_name;

查看表创建语句

sql
SHOW CREATE TABLE table_name;

查看表状态

sql
SHOW TABLE STATUS LIKE 'table_name';

修改表

添加列

sql
ALTER TABLE table_name ADD COLUMN column_name VARCHAR(50) NOT NULL;

修改列

sql
ALTER TABLE table_name MODIFY COLUMN column_name VARCHAR(100) NULL;

修改列名

sql
ALTER TABLE table_name CHANGE COLUMN old_name new_name VARCHAR(50);

删除列

sql
ALTER TABLE table_name DROP COLUMN column_name;

添加主键

sql
ALTER TABLE table_name ADD PRIMARY KEY (id);

添加索引

sql
ALTER TABLE table_name ADD INDEX idx_name (column_name);

添加唯一索引

sql
ALTER TABLE table_name ADD UNIQUE INDEX idx_unique_name (column_name);

删除表

基本删除

sql
DROP TABLE table_name;

删除表(如果存在)

sql
DROP TABLE IF EXISTS table_name;

批量删除表

sql
DROP TABLE IF EXISTS table1, table2, table3;

清空表

清空表数据(保留表结构)

sql
TRUNCATE TABLE table_name;

使用DELETE清空表(逐行删除,可回滚)

sql
DELETE FROM table_name;

数据操作命令

插入数据

插入单行数据

sql
INSERT INTO table_name (name, age) VALUES ('John', 30);

插入多行数据

sql
INSERT INTO table_name (name, age) VALUES 
('John', 30),
('Jane', 25),
('Bob', 35);

插入查询结果

sql
INSERT INTO table_name (name, age) 
SELECT name, age FROM another_table WHERE status = 1;

查询数据

基本查询

sql
SELECT * FROM table_name;

查询指定列

sql
SELECT name, age FROM table_name;

带WHERE条件查询

sql
SELECT * FROM table_name WHERE age > 25;

排序查询

sql
SELECT * FROM table_name ORDER BY age DESC;

分组查询

sql
SELECT age, COUNT(*) FROM table_name GROUP BY age;

分页查询

sql
SELECT * FROM table_name LIMIT 10 OFFSET 20;
-- 或 MySQL 5.0+ 支持的简写
SELECT * FROM table_name LIMIT 20, 10;

联表查询

sql
SELECT t1.name, t2.order_no 
FROM users t1 
JOIN orders t2 ON t1.id = t2.user_id;

更新数据

基本更新

sql
UPDATE table_name SET age = 31 WHERE name = 'John';

批量更新

sql
UPDATE table_name SET status = 0 WHERE created_at < '2023-01-01';

使用子查询更新

sql
UPDATE table_name SET age = (SELECT MAX(age) FROM another_table) WHERE id = 1;

删除数据

基本删除

sql
DELETE FROM table_name WHERE id = 1;

批量删除

sql
DELETE FROM table_name WHERE status = 0;

使用子查询删除

sql
DELETE FROM table_name WHERE id IN (SELECT user_id FROM another_table WHERE status = 0);

用户与权限管理命令

用户管理

创建用户

sql
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';

创建用户(使用特定认证插件)

sql
CREATE USER 'username'@'%' IDENTIFIED WITH mysql_native_password BY 'password';

查看用户

sql
SELECT user, host FROM mysql.user;
-- 或
SHOW USERS; -- MySQL 8.0+ 支持

修改用户密码

sql
-- MySQL 5.7.6+
ALTER USER 'username'@'localhost' IDENTIFIED BY 'new_password';

-- MySQL 5.7.5及之前
SET PASSWORD FOR 'username'@'localhost' = PASSWORD('new_password');

删除用户

sql
DROP USER 'username'@'localhost';

权限管理

授予权限

sql
-- 授予所有权限(不推荐)
GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' WITH GRANT OPTION;

-- 授予特定数据库的所有权限
GRANT ALL PRIVILEGES ON database_name.* TO 'username'@'localhost';

-- 授予特定表的SELECT和INSERT权限
GRANT SELECT, INSERT ON database_name.table_name TO 'username'@'localhost';

查看用户权限

sql
SHOW GRANTS FOR 'username'@'localhost';

撤销权限

sql
-- 撤销特定权限
REVOKE INSERT ON database_name.table_name FROM 'username'@'localhost';

-- 撤销所有权限
REVOKE ALL PRIVILEGES ON *.* FROM 'username'@'localhost';

刷新权限

sql
FLUSH PRIVILEGES;

索引管理命令

创建索引

普通索引

sql
CREATE INDEX idx_name ON table_name (column_name);

唯一索引

sql
CREATE UNIQUE INDEX idx_unique_name ON table_name (column_name);

联合索引

sql
CREATE INDEX idx_name_age ON table_name (name, age);

全文索引

sql
CREATE FULLTEXT INDEX idx_fulltext_content ON table_name (content);

查看索引

sql
SHOW INDEX FROM table_name;
-- 或
SHOW INDEXES FROM table_name;

删除索引

sql
DROP INDEX idx_name ON table_name;

事务管理命令

事务控制

开始事务

sql
START TRANSACTION;
-- 或
BEGIN;

提交事务

sql
COMMIT;

回滚事务

sql
ROLLBACK;

保存点

sql
SAVEPOINT savepoint_name;
-- 回滚到保存点
ROLLBACK TO SAVEPOINT savepoint_name;
-- 删除保存点
RELEASE SAVEPOINT savepoint_name;

查看事务隔离级别

查看全局隔离级别

sql
SELECT @@GLOBAL.transaction_isolation;
-- 或 MySQL 5.7及之前
SELECT @@GLOBAL.tx_isolation;

查看会话隔离级别

sql
SELECT @@SESSION.transaction_isolation;
-- 或 MySQL 5.7及之前
SELECT @@SESSION.tx_isolation;

设置事务隔离级别

设置全局隔离级别

sql
SET GLOBAL transaction_isolation = 'READ COMMITTED';
-- 或 MySQL 5.7及之前
SET GLOBAL tx_isolation = 'READ-COMMITTED';

设置会话隔离级别

sql
SET SESSION transaction_isolation = 'REPEATABLE READ';
-- 或 MySQL 5.7及之前
SET SESSION tx_isolation = 'REPEATABLE-READ';

性能监控命令

查看服务器状态

查看所有状态变量

sql
SHOW GLOBAL STATUS;
-- 或查看会话状态
SHOW SESSION STATUS;

查看特定状态变量

sql
SHOW GLOBAL STATUS LIKE 'Connections';
-- 或使用SELECT
SELECT @@GLOBAL.Connections;

查看InnoDB状态

sql
SHOW ENGINE INNODB STATUS;

查看当前进程

sql
SHOW PROCESSLIST;
-- 或查看完整进程列表
SHOW FULL PROCESSLIST;

查看慢查询日志状态

sql
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'slow_query_log_file';
SHOW VARIABLES LIKE 'long_query_time';

查看锁状态

查看表锁

sql
SHOW OPEN TABLES WHERE In_use > 0;

查看行锁

sql
SELECT * FROM information_schema.innodb_locks;
SELECT * FROM information_schema.innodb_lock_waits;

配置管理命令

查看配置变量

查看所有全局变量

sql
SHOW GLOBAL VARIABLES;
-- 或查看会话变量
SHOW SESSION VARIABLES;

查看特定配置变量

sql
SHOW GLOBAL VARIABLES LIKE 'max_connections';
-- 或使用SELECT
SELECT @@GLOBAL.max_connections;

修改配置变量

修改全局变量(需要重启服务生效)

sql
SET GLOBAL max_connections = 200;

修改会话变量(仅当前会话生效)

sql
SET SESSION wait_timeout = 300;

MySQL 8.0持久化配置

sql
SET PERSIST max_connections = 200;

备份与恢复命令

备份命令

使用mysqldump备份单个数据库

bash
mysqldump -u username -p database_name > backup.sql

备份多个数据库

bash
mysqldump -u username -p --databases db1 db2 > backup.sql

备份所有数据库

bash
mysqldump -u username -p --all-databases > backup.sql

备份数据库结构(不包含数据)

bash
mysqldump -u username -p --no-data database_name > structure.sql

使用XtraBackup备份(热备份)

bash
xtrabackup --backup --target-dir=/path/to/backup --user=username --password=password

恢复命令

使用mysql命令恢复

bash
mysql -u username -p database_name < backup.sql

恢复所有数据库

bash
mysql -u username -p < backup.sql

使用XtraBackup恢复

bash
# 准备备份
xtrabackup --prepare --target-dir=/path/to/backup
# 恢复备份
xtrabackup --copy-back --target-dir=/path/to/backup

日志管理命令

查看日志配置

sql
SHOW VARIABLES LIKE '%log%';

开启/关闭日志

慢查询日志

sql
SET GLOBAL slow_query_log = ON;
SET GLOBAL slow_query_log_file = '/path/to/slow.log';
SET GLOBAL long_query_time = 1;

二进制日志

sql
SET GLOBAL log_bin = ON;
SET GLOBAL log_bin_basename = '/path/to/binlog';

错误日志

sql
SET GLOBAL log_error = '/path/to/error.log';

查看二进制日志

查看二进制日志列表

sql
SHOW BINARY LOGS;

查看当前二进制日志

sql
SHOW MASTER STATUS;

查看二进制日志内容

bash
mysqlbinlog /path/to/binlog.000001

复制管理命令

主从复制配置

主库查看状态

sql
SHOW MASTER STATUS;

从库配置主库信息

sql
CHANGE MASTER TO
    MASTER_HOST = 'master_host',
    MASTER_USER = 'replication_user',
    MASTER_PASSWORD = 'replication_password',
    MASTER_LOG_FILE = 'binlog.000001',
    MASTER_LOG_POS = 107;

启动从库复制

sql
START SLAVE;
-- MySQL 8.0+ 推荐使用
START REPLICA;

查看从库状态

sql
SHOW SLAVE STATUS\G;
-- MySQL 8.0+ 推荐使用
SHOW REPLICA STATUS\G;

停止从库复制

sql
STOP SLAVE;
-- MySQL 8.0+ 推荐使用
STOP REPLICA;

其他常用命令

查看MySQL版本

命令行方式

bash
mysql --version
--
mysql -V

SQL方式

sql
SELECT VERSION();
-- 或
SHOW VARIABLES LIKE 'version';

查看字符集

sql
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

查看存储引擎

查看支持的存储引擎

sql
SHOW ENGINES;

查看默认存储引擎

sql
SHOW VARIABLES LIKE 'default_storage_engine';

优化表

sql
OPTIMIZE TABLE table_name;

分析表

sql
ANALYZE TABLE table_name;

检查表

sql
CHECK TABLE table_name;

修复表

sql
REPAIR TABLE table_name;

常用工具命令

mysqladmin工具

查看服务器状态

bash
mysqladmin -u username -p status

查看服务器变量

bash
mysqladmin -u username -p variables

关闭服务器

bash
mysqladmin -u username -p shutdown

刷新权限

bash
mysqladmin -u username -p flush-privileges

mysqlcheck工具

检查所有数据库

bash
mysqlcheck -u username -p --all-databases

修复所有数据库

bash
mysqlcheck -u username -p --all-databases --repair

优化所有数据库

bash
mysqlcheck -u username -p --all-databases --optimize

mysqlimport工具

bash
mysqlimport -u username -p database_name data.txt

常用函数

字符串函数

sql
CONCAT('Hello', ' ', 'World') -- 连接字符串
SUBSTRING('Hello World', 1, 5) -- 截取子字符串
UPPER('hello') -- 转换为大写
LOWER('HELLO') -- 转换为小写
LENGTH('Hello') -- 获取字符串长度
TRIM('  Hello  ') -- 去除首尾空格

数值函数

sql
ABS(-10) -- 绝对值
ROUND(3.14159, 2) -- 四舍五入
CEIL(3.14) -- 向上取整
FLOOR(3.99) -- 向下取整
RAND() -- 生成随机数

日期时间函数

sql
NOW() -- 当前日期时间
CURDATE() -- 当前日期
CURTIME() -- 当前时间
DATE_ADD(NOW(), INTERVAL 1 DAY) -- 日期加法
DATE_SUB(NOW(), INTERVAL 1 MONTH) -- 日期减法
DATEDIFF('2023-12-31', '2023-01-01') -- 日期差

聚合函数

sql
COUNT(*) -- 计数
SUM(amount) -- 求和
AVG(score) -- 平均值
MAX(price) -- 最大值
MIN(price) -- 最小值

总结

MySQL命令是数据库管理和维护的基础,掌握常用命令对于DBA和开发人员来说至关重要。本文档总结了MySQL在连接管理、数据库管理、表操作、数据操作、用户权限管理、索引管理、事务管理、性能监控、配置管理、备份恢复等方面的常用命令,涵盖了日常运维工作中的大部分场景。

在实际使用中,应根据具体业务场景和MySQL版本选择合适的命令,并注意命令的安全性和性能影响。同时,建议定期备份数据,确保数据安全,并持续监控数据库性能,及时优化和调整配置。