一,mysql
mysql 是 MySQL 数据库的官方命令行客户端工具,用于连接到 MySQL 服务器并执行 SQL 语句、管理数据库和表等操作。以下是它的核心功能和使用方法:
1.1 基本语法
mysql [选项] [数据库名]
1.2 核心功能
- 连接 MySQL 服务器:通过命令行登录数据库。
- 执行 SQL 语句:交互式输入 SQL 或执行外部 SQL 文件。
- 管理数据:查询、插入、更新、删除数据,管理表结构等。
- 脚本自动化:结合 Shell 脚本批量处理数据库任务。
1.3 常用选项
| 选项 | 说明 |
|---|---|
-u <用户名> | 指定登录用户名(默认 root)。 |
-p | 提示输入密码(推荐使用,避免在命令行明文输入密码)。 |
-h <主机地址> | 连接远程 MySQL 服务器(默认 localhost)。 |
-P <端口号> | 指定 MySQL 服务端口(默认 3306)。 |
-D <数据库名> | 直接连接到指定数据库(等同 USE 数据库名;)。 |
-e "<SQL语句>" | 执行单条 SQL 语句后退出(非交互模式)。 |
--execute=<文件> | 执行外部 SQL 文件(等同 source 文件.sql)。 |
--verbose | 显示详细执行过程(调试用)。 |
--safe-updates | 启用安全模式(禁止无 WHERE 的 UPDATE 或 DELETE)。 |
1.4 使用示例
-
登录 MySQL 服务器
# 本地登录(默认用户 root,端口 3306) mysql -u root -p # 远程登录(主机 192.168.1.100,用户 admin,端口 3307) mysql -u admin -h 192.168.1.100 -P 3307 -p -
直接连接到指定数据库
# 登录并选择 mydb 数据库 mysql -u root -p -D mydb -
执行单条 SQL 命令(非交互模式)
# 查询所有数据库(执行后退出) mysql -u root -p -e "SHOW DATABASES;" -
执行外部 SQL 文件
# 执行备份文件恢复数据 mysql -u root -p mydb < backup.sql # 或登录后使用 source 命令 mysql> source /path/to/backup.sql; -
启用安全模式
# 防止误删数据(必须带 WHERE 条件) mysql -u root -p --safe-updates
1.5 高级用法
-
结合管道处理数据
# 导出 CSV 数据(需权限) echo "SELECT * FROM users INTO OUTFILE '/tmp/users.csv';" | mysql -u root -p mydb -
自动化脚本
# 批量执行 SQL 语句 mysql -u root -p -e " CREATE DATABASE test; USE test; CREATE TABLE logs (id INT, message TEXT); "
二,mysqladmin
mysqladmin 是 MySQL 提供的命令行管理工具,用于执行数据库服务器的管理操作,例如监控状态、创建/删除数据库、关闭服务器等。
2.1 基本语法
mysqladmin [选项] 命令 [命令参数]
2.2 常用命令与示例
| 命令 | 作用 | 示例 |
|---|---|---|
ping | 检查MySQL服务是否运行 | mysqladmin -u root -p ping (返回 mysqld is alive 表示服务正常) |
status | 查看服务器简要状态 | mysqladmin -u root -p status (显示运行时间、线程数、查询数等) |
processlist | 查看当前活动线程(连接) | mysqladmin -u root -p processlist (类似 SHOW PROCESSLIST;) |
create 数据库名 | 创建新数据库 | mysqladmin -u root -p create mydb |
drop 数据库名 | 删除数据库 | mysqladmin -u root -p drop mydb (会提示确认) |
shutdown | 关闭MySQL服务器 | mysqladmin -u root -p shutdown (需权限,谨慎使用!) |
flush-hosts | 清除被阻塞的主机连接 | mysqladmin -u root -p flush-hosts (解决“Too many connections”错误) |
flush-privileges | 重新加载权限表(等同FLUSH PRIVILEGES) | mysqladmin -u root -p flush-privileges |
variables | 查看服务器系统变量 | mysqladmin -u root -p variables (显示所有变量,可搭配 grep 过滤) |
version | 查看MySQL版本信息 | mysqladmin -u root -p version |
2.3 常用选项
| 选项 | 说明 |
|---|---|
-u 用户名 | 指定登录用户(默认 root) |
-p | 提示输入密码(推荐使用,避免明文密码) |
-h 主机地址 | 连接远程MySQL服务器(默认 localhost) |
-P 端口号 | 指定端口(默认 3306) |
--socket=SOCKET | 指定Unix Socket文件路径 |
2.4 典型使用场景
-
快速检查服务状态
mysqladmin -u root -p ping # 输出:mysqld is alive -
监控服务器负载
mysqladmin -u root -p status # 输出: # Uptime: 1000 Threads: 3 Questions: 100 Slow queries: 0 Opens: 200 Flush tables: 1 ... -
批量执行命令
mysqladmin -u root -p flush-hosts flush-privileges # 同时刷新主机缓存和权限表
2.5 注意事项
-
密码安全:
-
避免在命令行中直接写密码(如
-p123456),使用-p交互输入更安全。 -
推荐使用
~/.my.cnf配置文件存储账号密码:[mysqladmin] user=root password=your_password
-
-
权限要求:
- 执行
shutdown、create/drop database等操作需要高权限(如SHUTDOWN、CREATE权限)。
- 执行
-
远程管理:
- 若连接远程服务器,确保用户有远程访问权限(如
'root'@'%')。
- 若连接远程服务器,确保用户有远程访问权限(如
三,mysqlbinlog
mysqlbinlog 是 MySQL 提供的命令行工具,用于解析、查看和管理二进制日志(Binary Log)。二进制日志记录了数据库的所有数据变更操作(如增删改)及结构变更,是数据恢复、主从复制的核心组件。
3.1 核心功能
- 查看二进制日志内容:将二进制日志转换为可读的文本或 SQL 语句。
- 数据恢复:从日志中提取特定操作,恢复误删或误改的数据。
- 主从复制分析:解析主库的二进制日志,排查复制问题。
- 日志过滤:按时间、位置、数据库等条件筛选操作记录。
3.2 基本语法
mysqlbinlog [选项] binlog文件名
3.3 常用选项与示例
-
查看日志内容
-
默认输出(BINLOG格式,含原始字节):
mysqlbinlog mysql-bin.000001 -
转换为SQL语句(便于阅读):
mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.000001
-
-
按时间范围过滤
mysqlbinlog \ --start-datetime="2023-10-01 00:00:00" \ --stop-datetime="2023-10-02 23:59:59" \ mysql-bin.000001 -
按位置点过滤
mysqlbinlog \ --start-position=12345 \ --stop-position=67890 \ mysql-bin.000001 -
仅输出特定数据库的操作
mysqlbinlog --database=mydb mysql-bin.000001 -
导出为SQL文件(用于恢复)
mysqlbinlog mysql-bin.000001 > backup.sql -
直接应用到数据库
mysqlbinlog mysql-bin.000001 | mysql -u root -p -
远程解析日志
mysqlbinlog \ --read-from-remote-server \ --host=192.168.1.100 \ --user=repl_user \ --password \ mysql-bin.000001
3.4 关键使用场景
-
误操作恢复
# 1. 查找误操作的时间或位置点 mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.000001 # 2. 导出误操作前的日志到SQL文件(假设误操作在位置50000之后) mysqlbinlog --stop-position=50000 mysql-bin.000001 > restore.sql # 3. 执行恢复 mysql -u root -p < restore.sql -
分析主从复制问题
# 查看主库的二进制日志事件 mysqlbinlog --base64-output=DECODE-ROWS -v mysql-bin.000001 # 对比从库的relay log是否同步 -
监控数据库变更
# 实时解析最新日志(需开启GTID或指定位置) mysqlbinlog --read-from-remote-server -u root -p --host=localhost \ --start-position=$(cat last_pos.txt) \ --to-last-log \ mysql-bin.000001
3.5 注意事项
- 二进制日志需启用:
- 在
my.cnf中配置log-bin=mysql-bin。
- 在
- 权限要求:
- 本地解析需文件读取权限,远程解析需
REPLICATION CLIENT权限。
- 本地解析需文件读取权限,远程解析需
- ROW格式日志处理:
- 若二进制日志格式为
ROW,需添加-v或--verbose选项解码。
- 若二进制日志格式为
- GTID模式:
- 使用
--skip-gtids可忽略GTID信息,避免重复执行冲突。
- 使用
3.6 常用选项速查表
| 选项 | 作用 |
|---|---|
--base64-output=DECODE-ROWS | 解码ROW格式的日志内容 |
-v 或 --verbose | 显示更详细的信息(如完整SQL语句) |
--start-datetime | 按开始时间过滤日志事件 |
--stop-datetime | 按结束时间过滤日志事件 |
--start-position | 按起始位置点过滤日志 |
--stop-position | 按结束位置点过滤日志 |
--database | 仅显示指定数据库的操作 |
--read-from-remote-server | 从远程服务器读取日志文件 |
--result-file | 将输出保存到指定文件 |
四,mysqlshow
mysqlshow 是 MySQL 提供的命令行工具,用于快速查看数据库、表、列的结构信息,类似于在 MySQL 客户端中执行 SHOW DATABASES、SHOW TABLES 等命令,但无需进入交互式界面。它特别适合快速检查元数据或编写脚本时使用。
4.1 基本语法
mysqlshow [选项] [数据库名 [表名 [列名]]]
4.2 常用功能与示例
-
查看所有数据库
mysqlshow -u root -p输出
+--------------------+ | Databases | +--------------------+ | information_schema | | mysql | | performance_schema | | mydb | +--------------------+ -
查看某个数据库的表
mysqlshow -u root -p mydb输出
Database: mydb +------------+ | Tables | +------------+ | users | | orders | | products | +------------+ -
查看表的列结构
```bash
mysqlshow -u root -p mydb users
```
**输出**
```
Database: mydb Table: users
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(50) | YES | | NULL | |
| email | varchar(100) | YES | UNI | NULL | |
+-------------+--------------+------+-----+---------+----------------+
4. 显示表的统计信息(行数、引擎等)
```bash
mysqlshow -u root -p --count mydb users
```
**输出**
```
Database: mydb Table: users Rows: 100
+-------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+----------------+
| ...(列结构同上)... |
+-------------+--------------+------+-----+---------+----------------+
5. 使用通配符过滤表或列
```bash
# 查看以 "user" 开头的表
mysqlshow -u root -p mydb "user%"
# 查看表中以 "name" 结尾的列
mysqlshow -u root -p mydb users "%name"
4.3 常用选项
| 选项 | 作用 |
|---|---|
-u 用户名 | 指定登录用户(默认 root) |
-p | 提示输入密码 |
-h 主机地址 | 连接远程服务器(默认 localhost) |
-P 端口 | 指定端口(默认 3306) |
--count | 显示表的行数 |
--keys | 显示表的索引信息 |
--status | 显示表的详细状态(存储引擎、行数、创建时间等) |
-i 或 --info | 显示表和列的注释信息 |
4.4 典型使用场景
-
快速检查数据库结构
# 查看所有数据库 mysqlshow -u root -p # 查看某个数据库的所有表 mysqlshow -u root -p mydb # 查看表的列信息 mysqlshow -u root -p mydb users -
统计表数据量
mysqlshow -u root -p --count mydb orders输出
Database: mydb Table: orders Rows: 5000 -
检查表的存储引擎和状态
mysqlshow -u root -p --status mydb products输出
Database: mydb Table: products Rows: 200 Create_time: 2023-10-01 12:34:56 Update_time: NULL Engine: InnoDB Collation: utf8mb4_general_ci
4.5 注意事项
- 权限要求:
- 需要
SELECT权限查看表结构,SHOW DATABASES权限查看数据库列表。
- 需要
- 输出格式化:
- 默认输出为表格格式,若需脚本处理,可结合
grep、awk过滤。
- 默认输出为表格格式,若需脚本处理,可结合
- 与 SQL 命令对比:
- 功能等价于
SHOW DATABASES、SHOW TABLES等,但更轻量快捷。
- 功能等价于
五,mysqldump
mysqldump 是 MySQL 提供的命令行工具,用于逻辑备份数据库或表,生成包含 SQL 语句的文本文件(如 CREATE TABLE 和 INSERT),可通过该文件恢复数据。它是 MySQL 数据备份与迁移的核心工具之一。
5.1 核心功能
- 全库备份:导出整个数据库或所有数据库。
- 部分备份:导出指定表、符合条件的数据。
- 结构备份:仅导出表结构(不含数据)。
- 数据迁移:跨服务器、跨版本迁移数据。
- 避免锁表:通过事务或快照实现无锁备份(InnoDB)。
5.2 基本语法
mysqldump [选项] 数据库名 [表名] > 备份文件.sql
5.3 常用选项与示例
-
全库备份
# 备份所有数据库(含系统库) mysqldump -u root -p --all-databases > full_backup.sql # 备份指定数据库 mysqldump -u root -p mydb > mydb_backup.sql -
仅备份表结构
mysqldump -u root -p --no-data mydb > mydb_schema.sql -
仅备份数据
mysqldump -u root -p --no-create-info mydb > mydb_data.sql -
备份指定表
mysqldump -u root -p mydb users orders > mydb_tables.sql -
条件备份(导出部分数据)
# 导出 users 表中 id < 100 的记录 mysqldump -u root -p --where="id < 100" mydb users > users_filtered.sql -
无锁备份(InnoDB)
mysqldump -u root -p --single-transaction mydb > mydb_no_lock.sql -
压缩备份
mysqldump -u root -p mydb | gzip > mydb.sql.gz -
远程备份
mysqldump -h 192.168.1.100 -P 3306 -u remote_user -p mydb > remote_backup.sql
5.4 关键选项详解
| 选项 | 作用 |
|---|---|
--all-databases | 备份所有数据库 |
--no-data | 仅导出表结构,不导出数据 |
--no-create-info | 仅导出数据,不包含 CREATE TABLE 语句 |
--single-transaction | 对 InnoDB 表启用事务快照,实现无锁备份(需事务隔离级别为 REPEATABLE READ) |
--lock-tables | 备份时锁定所有表(默认 MyISAM 表会启用,InnoDB 建议用 --single-transaction) |
--where="条件" | 按条件导出数据(仅限单表) |
--ignore-table=db.tbl | 忽略指定表(可重复多次) |
--skip-comments | 不生成注释(减小备份文件体积) |
--hex-blob | 以十六进制导出 BLOB 类型数据(避免编码问题) |
--result-file=文件名 | 指定输出文件路径(Windows 需使用此选项避免换行符问题) |
5.5 数据恢复
-
命令行恢复
mysql -u root -p mydb < mydb_backup.sql -
恢复全库备份
```bash
mysql -u root -p < full_backup.sql
3. 恢复压缩备份
```bash
gunzip < mydb.sql.gz | mysql -u root -p mydb
```
5.6 注意事项
-
备份一致性:
- MyISAM 表需用
--lock-tables锁表,可能阻塞写入。 - InnoDB 表优先使用
--single-transaction实现无锁备份。
- MyISAM 表需用
-
大表备份优化:
- 结合
--quick(逐行导出)减少内存占用。 - 分库分表备份,降低单文件体积。
- 结合
-
版本兼容性:
- 高版本 MySQL 导出的备份可能不兼容低版本(如默认字符集差异)。
- 使用
--skip-dump-date避免备份文件中的时间注释影响差异对比。
-
安全建议:
- 备份文件需加密或限制访问权限(含敏感数据)。
- 定期验证备份文件可恢复性。
5.7 典型场景
-
每日全量备份
mysqldump -u root -p --single-transaction --all-databases | gzip > /backup/full_$(date +%F).sql.gz -
仅备份新增数据(配合 binlog)
# 1. 全量备份 mysqldump -u root -p --single-transaction --flush-logs --all-databases > full.sql # 2. 后续通过 binlog 增量恢复 mysqlbinlog mysql-bin.000001 | mysql -u root -p -
导出表结构用于版本控制
mysqldump -u root -p --no-data --skip-comments mydb > schema.sql
六,mysqlimoort
mysqlimoort用于快速将文本文件(如 CSV、TXT)批量导入到数据库表中。
6.1 核心功能
- 批量导入数据:将文本文件内容高效导入到指定表。
- 自动匹配字段:根据文件列顺序与表结构匹配(需文件列与表字段顺序一致)。
- 替代 SQL 语句:相当于
LOAD DATA INFILE命令的封装,但更简洁。
6.2 基本语法
mysqlimport [选项] 数据库名 文件名
注意:
- 文件名需与表名一致(例如文件
users.txt默认导入到users表)。 - 文件路径需绝对路径或相对路径(需权限)。
6.3 常用选项与示例
-
基本导入
# 将 users.csv 导入到 mydb 数据库的 users 表 mysqlimport -u root -p --fields-terminated-by=',' mydb /path/users.csv -
指定分隔符
# 字段以逗号分隔,行以换行符结束 mysqlimport -u root -p \ --fields-terminated-by=',' \ --lines-terminated-by='\n' \ mydb /path/users.txt -
忽略指定行
# 跳过文件前1行(如标题行) mysqlimport -u root -p --ignore-lines=1 mydb /path/users.csv -
覆盖重复数据
# 若唯一键冲突,替换旧数据 mysqlimport -u root -p --replace mydb /path/users.csv -
仅导入指定列
```bash
# 文件只包含 name 和 email 列(需文件列顺序与表字段一致)
mysqlimport -u root -p --columns=name,email mydb /path/users.csv
6. 压缩文件导入
```bash
gunzip < users.csv.gz | mysqlimport -u root -p mydb -
6.4 关键选项详解
| 选项 | 作用 |
|---|---|
--fields-terminated-by | 字段分隔符(默认 \t) |
--fields-enclosed-by | 字段包围符(如 ") |
--lines-terminated-by | 行结束符(默认 \n) |
--ignore-lines=N | 跳过文件前 N 行(如标题行) |
--replace | 冲突时替换旧数据 |
--ignore | 冲突时跳过新数据 |
--columns=列名列表 | 指定导入的列(需与文件列顺序一致) |
--local | 从客户端本地读取文件(默认需服务器权限) |
--verbose | 显示详细执行过程 |
6.5 使用场景
-
快速导入 CSV 数据
mysqlimport -u root -p \ --fields-terminated-by=',' \ --fields-optionally-enclosed-by='"' \ mydb /data/products.csv -
从日志文件批量导入
# 日志字段以竖线分隔 mysqlimport -u root -p \ --fields-terminated-by='|' \ --ignore-lines=1 \ mydb /logs/access.log -
定时导入增量数据
# 每天导入新增数据(结合 crontab) 0 2 * * * mysqlimport -u root -p密码 --local mydb /daily_data/$(date +\%F).csv
6.6 注意事项
-
文件权限:
- 若使用
--local,需确保 MySQL 客户端有权限读取文件。 - 默认情况下,MySQL 服务器需有权限访问文件路径(安全风险较高,建议用
--local)。
- 若使用
-
数据一致性:
- 导入前备份数据,避免误覆盖。
- 若需事务支持,建议改用
LOAD DATA INFILE或分批次导入。
-
性能优化:
- 大文件导入时,关闭索引(导入前
ALTER TABLE ... DISABLE KEYS,完成后重建)。 - 使用
--local可减少网络传输开销。
- 大文件导入时,关闭索引(导入前
-
编码问题:
- 文件编码需与表字符集一致(如 UTF-8),否则可能乱码。
6.7 与 LOAD DATA INFILE 对比
| 特性 | mysqlimport | LOAD DATA INFILE(SQL 语句) |
|---|---|---|
| 使用方式 | 命令行工具 | 需在 MySQL 客户端中执行 |
| 灵活性 | 依赖文件名与表名匹配 | 可指定任意文件路径和表名 |
| 适用场景 | 快速脚本调用 | 需要复杂条件或程序集成时使用 |
| 性能 | 相同(底层实现一致) | 相同 |
七,source
MySQL 的 source 命令(或在 MySQL 客户端中简写为 \.)用于在 MySQL 命令行界面中执行外部 SQL 文件,类似于脚本的批量运行。它可以帮助你快速导入数据、执行复杂的 SQL 脚本或恢复数据库备份。
7.1 基本语法
-- 在 MySQL 命令行中执行:
mysql> source /path/to/file.sql;
-- 或简写为:
mysql> \. /path/to/file.sql;
7.2 核心功能
- 批量执行 SQL 语句:运行包含
CREATE、INSERT、UPDATE等操作的 SQL 文件。 - 数据恢复:导入备份的
.sql文件(如通过mysqldump生成的备份)。 - 初始化数据库:执行建表、插入初始化数据的脚本。
7.3 使用步骤与示例
-
登录 MySQL 客户端
mysql -u root -p -
选择目标数据库
USE mydb; -
执行 SQL 文件
source /home/user/backup.sql;
输出示例:
Query OK, 0 rows affected (0.00 sec)
Query OK, 10 rows affected (0.01 sec)
...
7.4 注意事项
- 文件路径问题
- 绝对路径:推荐使用完整路径(如
/home/user/file.sql),避免相对路径歧义。 - 权限问题:确保 MySQL 用户有权限读取该文件(尤其是 Linux 系统下的文件权限)。
- 绝对路径:推荐使用完整路径(如
- 文件编码
- SQL 文件需与 MySQL 客户端的字符集一致(如 UTF-8),否则可能出现乱码错误。
- 大文件处理
- 性能问题:
source是逐行解析执行,大文件(如 GB 级)可能耗时较长。 - 替代方案:在 Shell 中使用
mysql < file.sql更高效。
- 性能问题:
7.5 典型使用场景
- 恢复数据库备份:
mysql> source /backup/mydb_20231001.sql; - 执行初始化脚本:
mysql> source /init/schema_and_data.sql; - 批量更新数据:
mysql> source /update/price_adjust.sql;