MySQL 常用操作指南(Shell 环境)

一、Shell 中导入/导出数据

1. 本地导入数据(LOAD DATA LOCAL INFILE)

复制代码
mysql -u root -p -e "LOAD DATA LOCAL INFILE '/path/to/file.csv' INTO TABLE stu.students FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 ROWS;"

注意: 需确保 MySQL 启用了 local_infile(默认可能关闭):

复制代码
SHOW VARIABLES LIKE 'local_infile'; -- 查看
SET GLOBAL local_infile = 'ON';     -- 临时开启(需权限)
  • 客户端连接时也要加 --local-infile=1:

    复制代码
    mysql --local-infile=1 -u root -p
  • IGNORE 1 ROWS 跳过 CSV 的标题行。

  • 文件路径是客户端所在机器的路径(不是数据库服务器)。


2. 导出数据(mysqldump)

基础导出表结构+数据:
复制代码
mysqldump -u root -p123456 stu students > /root/data/mydb.sql

⚠️ 安全警告 :密码明文写在命令行会泄露(可通过 history 查看)。
推荐做法:

  • 使用配置文件(~/.my.cnf):

    复制代码
    [client]
    user=root
    password=123456

    然后:

    复制代码
    mysqldump stu students > /root/data/mydb.sql
  • 或交互式输入密码(不写 -p123456,只写 -p)

导出仅数据(无建表语句):
复制代码
mysqldump -u root -p --no-create-info stu students > data_only.sql
导出仅结构(无数据):
复制代码
mysqldump -u root -p --no-data stu students > schema_only.sql
备份并压缩(推荐):
复制代码
alias db_backup='mysqldump -u root -p --single-transaction --quick --lock-tables=false stu students | gzip > /root/data/mydb_$(date +%Y%m%d).sql.gz'

参数说明:

  • --single-transaction:InnoDB 一致性快照(避免锁表)
  • --quick:逐行读取,防内存溢出
  • --lock-tables=false:配合 --single-transaction 避免锁

二、查看 DDL 与当前数据库

复制代码
-- 查看建表语句(修正拼写错误:show create table)
SHOW CREATE TABLE students\G

-- 查看当前数据库
SELECT DATABASE();
-- 或
STATUS;  -- 显示更多信息,包括当前库

三、LIMIT 限制查询

复制代码
-- 前10条
SELECT * FROM students LIMIT 10;

-- 分页:跳过前20条,取10条(第3页)
SELECT * FROM students LIMIT 20, 10;
-- 或
SELECT * FROM students LIMIT 10 OFFSET 20;

注意 :LIMIT 无 ORDER BY 时结果顺序不确定!


四、ALTER TABLE 表结构修改(扩展与规范)

增加字段(ADD)

复制代码
-- 推荐指定位置(如 FIRST / AFTER)
ALTER TABLE students ADD COLUMN enroll_date DATE DEFAULT '2025-12-12' AFTER name;

修改字段(MODIFY vs CHANGE)

操作 语法 用途
MODIFY MODIFY column_name new_type [options] 改类型/属性,不改名
CHANGE CHANGE old_name new_name new_type [options] 可改名+改类型
复制代码
-- MODIFY:只改类型和注释
ALTER TABLE students MODIFY dateT DATETIME COMMENT '入学时间';

-- CHANGE:改名 + 改类型
ALTER TABLE students CHANGE stu_id student_id VARCHAR(50) NOT NULL;

🔔 重要 :MODIFY 必须重写完整字段定义(类型、是否为空、默认值等),否则会被重置!

删除字段(DROP)

复制代码
ALTER TABLE students DROP COLUMN length;

修改字符集

复制代码
-- 修改表字符集(不影响已有数据编码!)
ALTER TABLE students CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 更彻底(同时转数据):
ALTER TABLE students CONVERT TO CHARACTER SET utf8mb4;

建议使用 utf8mb4(支持 emoji),而非 utf8(MySQL 的伪 utf8)

重命名表

复制代码
RENAME TABLE students TO student_info;
-- 或
ALTER TABLE students RENAME TO student_info;

五、删除表(DROP)

复制代码
-- 删除表(结构+数据全丢)
DROP TABLE students;

-- 安全写法:先检查是否存在
DROP TABLE IF EXISTS students;

六、补充:实用 Shell 脚本技巧

1. 自动备份脚本(带日期、压缩、日志)

复制代码
#!/bin/bash
DATE=$(date +%Y%m%d_%H%M)
BACKUP_DIR="/backup/mysql"
DB="stu"
TABLE="students"
USER="root"

mkdir -p $BACKUP_DIR

mysqldump --single-transaction -u$USER $DB $TABLE | gzip > $BACKUP_DIR/${DB}_${TABLE}_$DATE.sql.gz

echo "$(date): Backup completed: ${DB}_${TABLE}_$DATE.sql.gz" >> /var/log/db_backup.log

2. 设置定时任务(crontab)

复制代码
# 每天凌晨2点备份
0 2 * * * /root/scripts/db_backup.sh

七、安全与最佳实践总结

项目 建议
密码 不要明文写命令行,用 .my.cnf 或交互输入
备份 用 --single-transaction + 压缩 + 保留多版本
字符集 统一用 utf8mb4
ALTER 大表结构变更谨慎操作(可能锁表)
LOAD DATA 注意文件权限、路径、分隔符匹配
权限 生产环境避免用 root,创建专用账号
相关推荐
问商十三载11 分钟前
AI引擎生成式优化服务商怎么选?技术核验清单(附脚本)
数据库·人工智能·机器学习
TDengine (老段)12 分钟前
集群从“能用“到“高可用“:副本、选主与故障切换到底怎么配
大数据·网络·数据库·物联网·oracle·时序数据库·tdengine
ly768913 分钟前
ISR 收缩与 HW 推进:副本同步的边界条件与 UnderReplicated 排障
数据库·kafka·c#·linq·isr·hw·副本同步
Evand J22 分钟前
【MATLAB例程】三维A*路径规划与TOA-AOA-TDOA融合定位算法。附下载链接
数据库·算法·matlab
Dxy123931021628 分钟前
MySQL 条件注释语法
数据库·mysql
小小龙学IT30 分钟前
Go 语言 database/sql 标准库深度解析:从连接池到驱动抽象
数据库·sql·golang
Seraphina3640 分钟前
SQL注入(一)
数据库·经验分享·笔记·sql·网络安全
anew___43 分钟前
《从零手写操作系统 (19):Ext2文件系统实战——从内存到磁盘的跨越》
java·服务器·前端·数据库·算法
Arcai10241 小时前
SQL Server 备份和恢复完全指南:从入门到精通
数据库·sqlserver·数据恢复·数据备份·备份一体机·杭州智备
XS0301061 小时前
Redis 学习指南
数据库·redis·缓存