mysql 是 MySQL 数据库的命令行客户端工具,用于连接、操作和管理 MySQL 数据库服务器。它不是 Linux 系统命令,而是 MySQL 数据库的客户端程序。

📖 基本语法

mysql [选项] [数据库名]

🎯 常用连接选项

选项 说明
-h, --host=主机名 数据库服务器主机(默认 localhost)。
-P, --port=端口号 数据库服务器端口(默认 3306)。
-u, --user=用户名 连接用户名(默认当前系统用户)。
-p, --password[=密码] 密码提示。为安全起见,建议只写 -p 在提示时输入。
-S, --socket=套接字文件 用于本地连接的 Unix 套接字文件。
--protocol=协议 连接协议:tcp, socket, pipe, memory。

💡 核心用法示例

1. 连接数据库
# 连接到本地数据库(使用当前系统用户)
mysql

# 连接到本地数据库(指定用户,提示输入密码)
mysql -u root -p

# 连接到远程数据库
mysql -h db.example.com -u admin -p

# 连接到指定数据库
mysql -u user -p database_name

# 使用 socket 连接
mysql -u root -p -S /var/run/mysqld/mysqld.sock
2. 执行 SQL 语句
# 执行单条 SQL 语句
mysql -u root -p -e "SHOW DATABASES;"

# 执行多条 SQL 语句
mysql -u root -p -e "SHOW DATABASES; USE mysql; SHOW TABLES;"

# 从文件执行 SQL 脚本
mysql -u root -p < backup.sql

# 执行 SQL 并输出到文件
mysql -u root -p -e "SELECT * FROM users;" > output.txt
3. 交互式操作

进入 mysql 交互模式后,可以执行各种 SQL 命令:

-- 显示所有数据库
SHOW DATABASES;

-- 使用特定数据库
USE database_name;

-- 显示当前数据库的所有表
SHOW TABLES;

-- 查看表结构
DESCRIBE table_name;
DESC table_name;
SHOW COLUMNS FROM table_name;

-- 执行查询
SELECT * FROM users WHERE id = 1;

-- 退出 mysql
EXIT;
\q
QUIT;

🔧 常用客户端选项

选项 说明
-D, --database=数据库名 指定要使用的数据库。
-e, --execute=SQL语句 执行 SQL 语句并退出。
-f, --force 遇到错误继续执行。
-v, --verbose 显示详细输出。
-V, --version 显示版本信息。
--batch, -B 以制表符分隔格式输出,无边框。
--html 生成 HTML 格式输出。
--xml 生成 XML 格式输出。
--skip-column-names 不显示列名。
--sigint-ignore 忽略 SIGINT 信号(Ctrl+C)。
-H, --html 以 HTML 格式输出(同 --html)。
-X, --xml 以 XML 格式输出(同 --xml)。

📊 输出格式控制

# 默认表格格式
mysql -u root -p -e "SELECT * FROM users LIMIT 3;"

# 制表符分隔(适合脚本处理)
mysql -u root -p -B -e "SELECT * FROM users LIMIT 3;"

# 不显示列名
mysql -u root -p -B -N -e "SELECT * FROM users LIMIT 3;"

# HTML 格式输出
mysql -u root -p -H -e "SELECT * FROM users LIMIT 3;" > users.html

# XML 格式输出
mysql -u root -p -X -e "SELECT * FROM users LIMIT 3;" > users.xml

# 垂直格式显示(每列一行)
mysql -u root -p -E -e "SELECT * FROM users WHERE id=1;"

🔍 配置文件

MySQL 客户端可以从以下位置读取配置:

  1. /etc/my.cnf - 全局配置文件
  2. /etc/mysql/my.cnf - 全局配置文件
  3. ~/.my.cnf - 用户配置文件
  4. ./.my.cnf - 当前目录配置文件

示例 ~/.my.cnf 配置

[client]
host=localhost
user=root
password=your_password
database=mydb
port=3306

设置配置文件权限:

chmod 600 ~/.my.cnf

⚙️ 交互模式下的特殊命令

在 mysql 交互模式中,除了 SQL 语句,还可以使用以下命令(以反斜杠开头或特定关键字):

命令 说明
\c 取消当前命令。
\q, exit, quit 退出 mysql。
\G 垂直显示结果(每列一行)。
\g 执行命令(同 ;)。
\s 显示服务器状态信息。
\h, help 显示帮助信息。
\u, use 切换数据库,如 \u dbname
\r, reconnect 重新连接到服务器。
\! 执行系统 Shell 命令,如 \! ls
\T 开始记录输出到文件,如 \T /tmp/mysql.log
\t 停止记录输出。
\#/*! */ MySQL 特有的注释,可在其他数据库忽略。
source\. 执行 SQL 脚本文件,如 source file.sql\. file.sql
system 执行系统 Shell 命令,如 system ls
status 显示服务器状态。
nowarning 忽略警告信息。
warnings 显示警告信息。
charset 切换字符集,如 charset utf8mb4

📋 实用操作示例

1. 数据库备份与恢复
# 备份单个数据库
mysqldump -u root -p database_name > backup.sql

# 恢复数据库
mysql -u root -p database_name < backup.sql

# 备份所有数据库
mysqldump -u root -p --all-databases > all_backup.sql

# 只备份结构
mysqldump -u root -p --no-data database_name > structure.sql

# 只备份数据
mysqldump -u root -p --no-create-info database_name > data.sql
2. 批量操作
# 批量执行 SQL 文件
for file in *.sql; do
    echo "处理文件: $file"
    mysql -u root -p database_name < "$file"
done

# 从 CSV 导入数据
mysql -u root -p -e "LOAD DATA INFILE '/path/to/data.csv' INTO TABLE mytable FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';"

# 导出查询结果到 CSV
mysql -u root -p -B -e "SELECT * FROM users" | sed 's/\t/,/g' > users.csv
3. 脚本自动化
#!/bin/bash
# 自动备份数据库脚本

DB_USER="root"
DB_PASS="password"
DB_NAME="mydb"
BACKUP_DIR="/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)

# 创建备份目录
mkdir -p "$BACKUP_DIR"

# 备份数据库
mysqldump -u "$DB_USER" -p"$DB_PASS" "$DB_NAME" > "$BACKUP_DIR/${DB_NAME}_$DATE.sql"

# 压缩备份
gzip "$BACKUP_DIR/${DB_NAME}_$DATE.sql"

# 保留最近7天备份
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +7 -delete

echo "备份完成: $BACKUP_DIR/${DB_NAME}_$DATE.sql.gz"
4. 数据库管理
-- 创建数据库
CREATE DATABASE newdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 创建用户并授权
CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON newdb.* TO 'newuser'@'localhost';
FLUSH PRIVILEGES;

-- 查看用户权限
SHOW GRANTS FOR 'newuser'@'localhost';

-- 查看进程
SHOW PROCESSLIST;

-- 杀死进程
KILL process_id;

-- 查看系统变量
SHOW VARIABLES LIKE '%timeout%';

⚠️ 安全注意事项

  1. 密码安全

    # 不安全:密码在命令行中可见
    mysql -u root -ppassword
    
    # 安全:提示输入密码
    mysql -u root -p
    
    # 或使用配置文件
    mysql --defaults-file=~/.my.cnf
    
  2. 远程连接安全

    # 使用 SSL 连接
    mysql --ssl-mode=REQUIRED -h remote_host -u user -p
    
    # 指定 SSL 证书
    mysql --ssl-ca=/path/to/ca.pem --ssl-cert=/path/to/client-cert.pem --ssl-key=/path/to/client-key.pem
    
  3. 执行危险操作前备份

    # 删除数据前先备份
    mysqldump -u root -p database_name > backup_before_delete.sql
    mysql -u root -p -e "DELETE FROM large_table WHERE condition;"
    

🔧 故障排除

1. 连接问题
# 检查 MySQL 服务状态
systemctl status mysql
# 或
service mysql status

# 检查端口监听
netstat -tlnp | grep 3306
ss -tlnp | grep 3306

# 检查防火墙
sudo ufw status
sudo firewall-cmd --list-all

# 检查错误日志
tail -f /var/log/mysql/error.log
2. 权限问题
-- 检查用户权限
SELECT * FROM mysql.user WHERE User='username'\G

-- 修复权限
GRANT ALL PRIVILEGES ON database.* TO 'user'@'localhost';
FLUSH PRIVILEGES;
3. 编码问题
-- 查看当前字符集设置
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

-- 设置字符集
SET NAMES utf8mb4;

📌 最佳实践

  1. 使用配置文件:避免在命令行中暴露密码。
  2. 使用提示符:在脚本中使用 read -s 安全读取密码:
    read -sp "MySQL 密码: " MYSQL_PASSWORD
    mysql -u root -p"$MYSQL_PASSWORD" -e "SHOW DATABASES;"
    
  3. 备份重要数据:在执行 DROPDELETE 等操作前先备份。
  4. 使用事务:对于重要操作,使用事务确保数据一致性:
    START TRANSACTION;
    -- 执行操作
    COMMIT;
    -- 或回滚
    ROLLBACK;
    
  5. 监控性能:使用 EXPLAIN 分析查询性能:
    EXPLAIN SELECT * FROM users WHERE age > 30;
    

mysql 客户端是管理 MySQL 数据库的强大工具,掌握其用法对于数据库管理员和开发人员都至关重要。无论是简单的查询还是复杂的数据库管理,都可以通过命令行高效完成。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐