ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

MySQL完整命令手册:从连接到运维的全流程实战指南

MySQL完整命令手册:从连接到运维的全流程实战指南 1. 项目概述为什么你需要一份“完整”的MySQL命令手册干了这么多年后端开发和数据库运维我电脑里一直存着一个自己整理的MySQL命令文档每次换电脑、带新人或者自己突然卡壳的时候翻出来看一眼比去搜索引擎里大海捞针快多了。网上“MySQL常用命令大全”的资料确实不少但很多要么是零散的片段要么版本老旧要么就是只给命令不给上下文新手看了直挠头老手看了觉得不够用。所以今天我想把我这份压箱底的“完整”手册分享出来。这里的“完整”不是指穷举MySQL所有成百上千个命令和参数那不现实也没必要。我理解的“完整”是覆盖从连接数据库到日常增删改查再到进阶的库表管理、用户权限、数据导入导出、状态诊断这一条完整的工作流。无论你是刚学数据库的学生还是需要快速上手业务的开发或者是偶尔需要客串DBA的运维这份手册都能让你在大多数场景下找到那条“刚刚好”的命令并且理解它为什么这么用。这份手册会以“场景驱动”的方式组织你可以像查字典一样根据你手头要干的事快速定位到相关命令集。每个命令我都会配上最常用的选项说明和一个典型的用例更重要的是我会分享一些我踩过坑之后才明白的“注意事项”和“操作意图”让你知其然更知其所以然。2. 核心场景与命令分类解析面对一个MySQL数据库我们的操作可以归纳为几个核心场景。理解这些场景就能把零散的命令串联起来形成你自己的知识树。2.1 连接与退出一切操作的起点无论你是在Linux服务器上用命令行还是在Windows的CMD里第一步都是连接到MySQL服务。基础连接命令mysql -h 主机名 -P 端口号 -u 用户名 -p-h指定要连接的MySQL服务器地址。如果是连接本机可以省略或用-h 127.0.0.1或-h localhost。-P指定端口号。MySQL默认端口是3306如果服务器用的是默认端口这个参数可以省略。-u指定登录的用户名比如-u root。-p告诉客户端接下来需要输入密码。强烈建议使用-p后面不直接跟密码的方式而不是-pYourPassword因为后者会在命令行历史中留下明文密码存在安全风险。执行命令后会提示你输入密码。连接成功后你会看到MySQL的命令行提示符mysql。注意在有些生产环境或Docker容器中可能会通过环境变量MYSQL_PWD传递密码但这也是不安全的做法。最安全的方式是使用-p交互输入或者使用MySQL的选项文件如~/.my.cnf但该文件权限必须设置为仅当前用户可读chmod 600 ~/.my.cnf。退出MySQL客户端在mysql提示符下执行以下任一命令即可退出exit; -- 或者 quit; -- 或者 \q实操心得在自动化脚本中我们通常避免交互式输入密码。这时可以使用mysql_config_editor工具设置一个加密的登录路径然后通过mysql --login-pathname来连接既安全又方便。2.2 数据库级操作你的数据容器连接上之后我们通常是在某个具体的数据库Database里工作。你可以把数据库想象成一个大的仓库里面有很多货架表。查看所有数据库SHOW DATABASES;这条命令会列出当前MySQL实例中你有权限查看的所有数据库。初始化安装后你通常会看到information_schema,mysql,performance_schema,sys等系统库不要轻易修改它们。创建与删除数据库-- 创建数据库并指定默认的字符集和排序规则 CREATE DATABASE my_app_db DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; -- 删除数据库极其危险操作前务必再三确认 DROP DATABASE my_app_db;utf8mb4是现在最推荐的字符集它支持完整的UTF-8编码包括emoji表情。utf8在MySQL中是一个“阉割版”最多只支持3字节字符。库名、表名、字段名如果包含特殊字符或是关键字需要用反引号包裹这是一个好习惯。选择进入某个数据库USE my_app_db;执行后提示符可能会变成mysql [my_app_db]表示后续的操作默认都在这个数据库中进行。你也可以在连接时直接指定数据库mysql -u root -p my_app_db。2.3 表级操作数据的结构定义表是存放数据的基本单元。定义好表结构是保证数据质量的第一步。查看当前数据库中的所有表SHOW TABLES;查看表的结构字段、类型、约束等-- 查看简要信息 DESC user; -- 或 DESCRIBE user; -- 查看更详细的建表语句非常实用可以看到引擎、字符集、自增起始值等 SHOW CREATE TABLE user\G使用\G代替分号;可以让结果以垂直方式显示在字段较多时更易读。创建表这是一个综合性的命令包含了数据类型、约束、索引等核心概念。CREATE TABLE user ( id int(11) NOT NULL AUTO_INCREMENT COMMENT ‘用户ID’, username varchar(50) NOT NULL COMMENT ‘用户名’, email varchar(100) NOT NULL COMMENT ‘邮箱’, password_hash char(64) NOT NULL COMMENT ‘密码哈希值’, created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT ‘创建时间’, updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT ‘更新时间’, PRIMARY KEY (id), UNIQUE KEY uk_username (username), UNIQUE KEY uk_email (email), KEY idx_created_at (created_at) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT‘用户表’;AUTO_INCREMENT自动增长常用于主键。DEFAULT CURRENT_TIMESTAMP默认值为当前时间。ON UPDATE CURRENT_TIMESTAMP当行数据更新时此字段自动更新为当前时间。这对于记录最后修改时间非常有用。PRIMARY KEY主键唯一且非空。InnoDB引擎的表数据存储就是基于主键组织的聚簇索引。UNIQUE KEY唯一键保证该字段或字段组合的值在表中唯一。KEY/INDEX普通索引用于加速查询。这里为created_at创建了索引常用于按时间范围查询的场景。ENGINEInnoDB指定存储引擎。InnoDB支持事务、行级锁和外键是绝大多数场景的首选。MyISAM在只读或读多写少的特定历史场景中可能更快但不支持事务现已不推荐用于核心业务表。COMMENT为表和字段添加注释。这是一个极其重要但常被忽略的好习惯尤其对于团队协作和后期维护。修改表结构ALTER TABLE业务迭代中修改表结构是常事。ALTER TABLE功能强大但操作生产环境大表时需谨慎可能引起锁表。-- 添加一个字段 ALTER TABLE user ADD COLUMN phone varchar(20) DEFAULT NULL COMMENT ‘手机号’ AFTER email; -- 修改字段定义可修改类型、默认值、注释等 ALTER TABLE user MODIFY COLUMN email varchar(150) NOT NULL COMMENT ‘电子邮箱地址’; -- 重命名字段 ALTER TABLE user CHANGE COLUMN password_hash password char(64) NOT NULL COMMENT ‘密码密文’; -- 删除一个字段 ALTER TABLE user DROP COLUMN phone; -- 添加一个索引 ALTER TABLE user ADD INDEX idx_email_status (email, status); -- 删除一个索引 ALTER TABLE user DROP INDEX idx_created_at;重要注意事项对于百万级以上数据量的表直接ALTER TABLE可能会锁表很长时间影响线上服务。此时应考虑使用pt-online-schema-changePercona Toolkit 中的工具或 GitHub 的gh-ost等在线改表工具它们能在不长时间锁表的情况下完成结构变更。删除表DROP TABLE user;同样这是一个危险操作。在执行前最好先SELECT * FROM user LIMIT 5;确认一下表里是不是你要删的数据。清空表数据TRUNCATE TABLE user;TRUNCATE会删除表中所有数据并重置自增ID。它比DELETE FROM user;不带WHERE条件更快因为它是通过直接删除并重建表文件来实现的且不产生事务日志对于InnoDB自MySQL 8.0后TRUNCATE是DDL操作仍然是原子性的但方式不同。但正因为此它无法回滚。2.4 数据增删改查CRUD永恒的核心这是与数据库交互最频繁的部分。插入数据INSERT-- 插入单条指定列名推荐 INSERT INTO user (username, email, password_hash) VALUES (‘zhangsan’, ‘zhangsanexample.com’, ‘hashed_value_here’); -- 插入单条省略列名需提供所有列的值且顺序与表定义一致 INSERT INTO user VALUES (NULL, ‘zhangsan’, ‘zhangsanexample.com’, ‘hashed_value_here’, NOW(), NOW()); -- 批量插入效率远高于循环执行单条INSERT INSERT INTO user (username, email, password_hash) VALUES (‘lisi’, ‘lisiexample.com’, ‘hash1’), (‘wangwu’, ‘wangwuexample.com’, ‘hash2’), (‘zhaoliu’, ‘zhaoliuexample.com’, ‘hash3’);使用NULL可以让AUTO_INCREMENT列自动生成值。NOW()函数可以获取当前时间。批量插入能减少网络往返和SQL解析开销是提升性能的重要手段。查询数据SELECTSELECT语句是SQL中最复杂也最强大的部分。-- 最基本的查询 SELECT * FROM user; -- 选择特定列 SELECT id, username, email FROM user; -- 使用WHERE子句过滤 SELECT * FROM user WHERE id 1; SELECT * FROM user WHERE created_at ‘2023-01-01’ AND status ‘active’; -- 使用LIKE进行模糊查询%代表任意多个字符_代表一个字符 SELECT * FROM user WHERE username LIKE ‘张%’; -- 查找姓张的用户 -- 排序ORDER BY SELECT * FROM user ORDER BY created_at DESC; -- 按创建时间降序最新的在前 -- 限制结果集LIMIT常用于分页 SELECT * FROM user ORDER BY id DESC LIMIT 10; -- 最新的10条 SELECT * FROM user ORDER BY id DESC LIMIT 20 OFFSET 10; -- 第2页每页10条即跳过前10条取接下来的10条。MySQL 8.0 更推荐 LIMIT 10 OFFSET 20 或 LIMIT 20, 10 语法。 -- 分组聚合GROUP BY与聚合函数 SELECT status, COUNT(*) as user_count FROM user GROUP BY status; SELECT department_id, AVG(salary) as avg_salary FROM employee GROUP BY department_id; -- 连接查询JOIN -- 假设有另一张order表其中有user_id字段 SELECT u.username, o.order_id, o.amount FROM user u INNER JOIN order o ON u.id o.user_id WHERE u.status ‘active’ ORDER BY o.created_at DESC;性能提示SELECT *在生产代码中要慎用。明确指定需要的列可以减少网络传输的数据量也可能让覆盖索引生效提升查询速度。WHERE子句中的条件应尽量使用索引字段。更新数据UPDATE-- 更新特定行 UPDATE user SET email ‘new_emailexample.com’, updated_at NOW() WHERE id 1; -- 批量更新务必注意WHERE条件否则会更新全表 UPDATE user SET status ‘inactive’ WHERE last_login_at ‘2022-01-01’;致命警告执行UPDATE和DELETE语句前务必先写一个同条件的SELECT语句确认影响范围。例如在执行上面的批量更新前先跑一下SELECT COUNT(*) FROM user WHERE last_login_at ‘2022-01-01’;看看会影响多少行数据。没有WHERE条件的UPDATE和DELETE会作用于全表是线上事故的常见根源。删除数据DELETE-- 删除特定行 DELETE FROM user WHERE id 100; -- 批量删除 DELETE FROM log WHERE created_at DATE_SUB(NOW(), INTERVAL 30 DAY); -- 删除30天前的日志对于日志类需要定期清理的数据使用DELETE可能效率较低且会产生碎片。更好的方案是使用分区表Partitioning直接DROP旧的分区速度极快。同样先SELECT后DELETE。2.5 用户与权限管理安全的大门在Linux服务器上你不会直接用root用户做所有事。数据库也一样应该为不同应用创建专属用户并授予最小必要权限。查看所有用户MySQL用户信息存储在mysql.user系统表中。SELECT User, Host FROM mysql.user;注意MySQL的用户是由“用户名”和“主机名”共同确定的‘root’‘localhost’和‘root’‘192.168.1.%’是两个不同的用户。创建用户CREATE USER ‘app_user’‘%’ IDENTIFIED BY ‘StrongPassword123!’;‘app_user’‘%’表示用户名为app_user可以从任何主机%通配符连接。生产环境中为了安全通常会限制主机如‘app_user’‘192.168.1.%’或‘app_user’‘application-server-ip’。IDENTIFIED BY后面跟的是明文密码MySQL会将其加密后存储。授予权限-- 授予对特定数据库的所有权限 GRANT ALL PRIVILEGES ON my_app_db.* TO ‘app_user’‘%’; -- 授予更细粒度的权限推荐 GRANT SELECT, INSERT, UPDATE, DELETE ON my_app_db.* TO ‘app_user’‘%’; GRANT SELECT, INSERT ON my_app_db.log_table TO ‘report_user’‘%’; -- 只对某张表有权限 -- 授予创建临时表的权限某些框架需要 GRANT CREATE TEMPORARY TABLES ON my_app_db.* TO ‘app_user’‘%’; -- 授予执行存储过程的权限 GRANT EXECUTE ON PROCEDURE my_app_db.cleanup_old_data TO ‘app_user’‘%’;权限授予后需要让服务器重新加载权限表才能使新权限生效FLUSH PRIVILEGES;查看用户权限SHOW GRANTS FOR ‘app_user’‘%’;撤销权限REVOKE DELETE ON my_app_db.* FROM ‘app_user’‘%’;同样执行FLUSH PRIVILEGES;使撤销生效。删除用户DROP USER ‘app_user’‘%’;实操心得权限管理黄金法则最小权限原则应用用户只赋予其业务必需的最小权限集。写操作INSERT, UPDATE, DELETE尤其要严格控制。避免使用%主机在生产环境尽量指定具体IP或IP段减少被爆破的风险。定期审计使用SHOW GRANTS定期检查各用户的权限清理无用或过期的账号。密码强度使用强密码并考虑定期更换。MySQL 5.7 提供了密码过期策略。2.6 数据导入与导出迁移与备份的基础这是数据备份、恢复、迁移的必备技能。导出数据mysqldumpmysqldump是MySQL官方自带的逻辑备份工具导出的是SQL语句。# 导出整个数据库包含结构和数据 mysqldump -h 127.0.0.1 -P 3306 -u root -pyour_password my_app_db my_app_db_backup.sql # 只导出表结构不包含数据 mysqldump -h 127.0.0.1 -P 3306 -u root -pyour_password --no-data my_app_db my_app_db_schema.sql # 只导出数据不包含结构 mysqldump -h 127.0.0.1 -P 3306 -u root -pyour_password --no-create-info my_app_db my_app_db_data.sql # 导出单张表 mysqldump -h 127.0.0.1 -P 3306 -u root -pyour_password my_app_db user user_table_backup.sql # 导出时压缩节省空间 mysqldump -h 127.0.0.1 -P 3306 -u root -pyour_password my_app_db | gzip my_app_db_backup.sql.gz密码写在命令行有安全风险更推荐使用-p交互输入或在配置文件中指定。对于大型数据库mysqldump可能会锁表尤其是MyISAM引擎。对于InnoDB可以使用--single-transaction选项来获得一个一致性视图避免锁表。--master-data和--dump-slave参数则在主从复制环境中非常有用。导入数据mysql / source# 方法一使用mysql命令行客户端 mysql -h 127.0.0.1 -P 3306 -u root -pyour_password my_app_db my_app_db_backup.sql # 方法二在mysql客户端内使用source命令 mysql USE my_app_db; mysql SOURCE /path/to/my_app_db_backup.sql;导出查询结果为CSV/Excel有时你需要将查询结果导出给运营或分析师。-- 在mysql客户端中执行导出为制表符分隔的文件 SELECT id, username, email INTO OUTFILE ‘/tmp/user_list.csv’ FIELDS TERMINATED BY ‘,’ OPTIONALLY ENCLOSED BY ‘“’ LINES TERMINATED BY ‘\n’ FROM user WHERE status ‘active’;注意INTO OUTFILE要求MySQL服务进程对指定路径有写权限且文件不能已存在。通常用于服务器本地导出。对于远程客户端更常用的方式是在客户端重定向输出mysql -e “SELECT ...“ local_file.csv但需要注意格式化可以使用--batch,--raw,-s等参数调整输出格式。从CSV文件导入数据LOAD DATA INFILE ‘/tmp/user_data.csv’ INTO TABLE user FIELDS TERMINATED BY ‘,’ OPTIONALLY ENCLOSED BY ‘“’ LINES TERMINATED BY ‘\n’ (username, email, password_hash); -- 指定列对应顺序LOAD DATA INFILE的速度比逐条INSERT快几个数量级是批量导入数据的首选方案。同样需要注意文件路径权限问题。2.7 状态诊断与性能查看运维的望远镜当应用变慢或出现问题时我们需要快速查看数据库的状态。查看系统变量和状态-- 查看所有全局变量配置 SHOW GLOBAL VARIABLES; -- 查看所有会话变量 SHOW SESSION VARIABLES; -- 查看特定变量如缓冲区大小 SHOW GLOBAL VARIABLES LIKE ‘%buffer%’; -- 查看服务器状态运行计数器如连接数、查询数等 SHOW GLOBAL STATUS LIKE ‘Threads_connected’; -- 当前连接数 SHOW GLOBAL STATUS LIKE ‘Queries’; -- 服务器启动以来的查询总数 SHOW GLOBAL STATUS LIKE ‘Innodb_rows_read’; -- InnoDB引擎读取的行数查看当前连接和进程SHOW PROCESSLIST;这个命令非常关键可以查看当前所有连接到MySQL的线程连接正在做什么。你可以看到每个连接的ID、用户、主机、正在操作的数据库、命令状态Sleep,Query,Locked等、执行时间以及正在执行的SQL语句片段。如果发现某个Query状态的连接执行时间Time列非常长它可能就是导致慢查询或锁等待的“元凶”。你可以使用KILL [connection_id];来终止这个连接需谨慎。查看表状态SHOW TABLE STATUS LIKE ‘user’\G可以查看表的行数Rows对于InnoDB是估算值、数据长度、索引长度、引擎、版本、行格式等信息。查看索引使用情况-- 查看某个表的索引 SHOW INDEX FROM user; -- 在查询语句前加上EXPLAIN分析查询执行计划 EXPLAIN SELECT * FROM user WHERE username ‘zhangsan’;EXPLAIN是SQL优化的神器。它会输出MySQL执行这条查询的“计划”包括type访问类型从好到坏大致是system const eq_ref ref range index ALL。ALL表示全表扫描通常需要优化。key实际使用的索引。rows预估需要扫描的行数。Extra额外信息如Using where,Using index,Using temporary,Using filesort。出现Using filesort或Using temporary通常意味着需要优化。开启和查看慢查询日志慢查询日志记录了执行时间超过指定阈值long_query_time的SQL语句是发现性能问题的宝库。-- 查看慢查询相关配置 SHOW GLOBAL VARIABLES LIKE ‘slow_query_log%’; SHOW GLOBAL VARIABLES LIKE ‘long_query_time’; -- 动态开启慢查询日志重启后会失效需在配置文件中修改才能持久化 SET GLOBAL slow_query_log ‘ON’; SET GLOBAL long_query_time 2; -- 设置阈值为2秒 SET GLOBAL slow_query_log_file ‘/var/log/mysql/slow.log’;开启后执行时间超过2秒的SQL都会被记录到指定文件。你可以使用mysqldumpslow或pt-query-digestPercona Toolkit等工具来分析慢日志文件找出最耗时的查询模式。3. 进阶技巧与实用命令掌握了基础CRUD和运维命令下面这些进阶技巧能让你的数据库操作更高效、更安全。3.1 事务处理保证数据的一致性InnoDB引擎支持事务。事务是一组要么全部成功、要么全部失败的SQL操作。-- 开启一个事务 START TRANSACTION; -- 或者 BEGIN; -- 执行一系列SQL操作 UPDATE account SET balance balance - 100 WHERE user_id 1; UPDATE account SET balance balance 100 WHERE user_id 2; -- 如果所有操作都成功提交事务 COMMIT; -- 如果中途发生错误回滚事务所有修改将被撤销 ROLLBACK;默认情况下MySQL处于自动提交autocommit1模式每条SQL语句都是一个独立的事务。使用START TRANSACTION会暂时关闭自动提交直到你执行COMMIT或ROLLBACK。事务有四大特性ACID原子性、一致性、隔离性、持久性。通过SET TRANSACTION ISOLATION LEVEL ...可以设置隔离级别如 READ COMMITTED, REPEATABLE READ。3.2 预处理语句Prepared Statement安全与性能兼得预处理语句可以有效防止SQL注入攻击并且对于需要重复执行的语句能提升性能。-- 准备一个预处理语句 PREPARE stmt FROM ‘SELECT * FROM user WHERE id ?’; -- 设置参数并执行 SET id 1; EXECUTE stmt USING id; -- 再次执行使用不同的参数 SET id 2; EXECUTE stmt USING id; -- 释放预处理语句 DEALLOCATE PREPARE stmt;在编程语言如PHP的PDOPython的MySQLdb/PyMySQLJava的JDBC中使用参数化查询Parameterized Query就是预处理语句的应用这是防范SQL注入的标准做法。3.3 信息函数与实用函数MySQL内置了很多函数可以在查询中直接使用。-- 获取最后插入的自增ID在同一个连接内有效 INSERT INTO user (username) VALUES (‘test’); SELECT LAST_INSERT_ID(); -- 获取当前数据库和用户 SELECT DATABASE(), USER(); -- 字符串连接 SELECT CONCAT(‘Hello, ‘, username, ‘!’) FROM user WHERE id1; -- 日期时间函数 SELECT NOW(), CURDATE(), CURTIME(); SELECT DATE_ADD(NOW(), INTERVAL 1 DAY); SELECT DATEDIFF(‘2023-12-31’, ‘2023-01-01’); -- 条件判断 SELECT username, CASE WHEN score 90 THEN ‘A’ WHEN score 60 THEN ‘B’ ELSE ‘C’ END AS grade FROM student; -- 聚合函数 SELECT COUNT(*), AVG(salary), MAX(salary), MIN(salary), SUM(salary) FROM employee;3.4 使用\c取消当前命令在MySQL命令行中如果你输入了一个很长的、有错误的SQL语句不想执行了不必按退格键删到底只需要输入\c然后回车就可以取消当前命令回到mysql提示符。mysql SELECT * FROM a_very_long_and_complicated_query WHERE ... - ... \c mysql4. 常见问题排查与操作心得数据库操作中难免会遇到各种“坑”这里记录了一些典型问题和我的处理经验。4.1 连接失败Access denied for user问题使用mysql -u root -p连接时提示权限错误。排查确认用户名、密码、主机名是否正确。注意‘root’‘localhost’和‘root’‘127.0.0.1’在MySQL中被视为不同的用户。检查用户是否存在以及是否有从当前主机连接的权限SELECT User, Host FROM mysql.user;。如果忘记root密码停止MySQL服务。以安全模式启动MySQL跳过权限表验证mysqld_safe --skip-grant-tables 具体命令因系统而异。无需密码登录MySQL然后使用UPDATE mysql.user SET authentication_stringPASSWORD(‘new_password’) WHERE User‘root’;MySQL 5.7 密码字段可能是authentication_string修改密码。注意MySQL 8.0以上修改密码的语法有变化建议先查文档。完成后务必FLUSH PRIVILEGES;并重启MySQL到正常模式。4.2 执行ALTER TABLE时卡住或锁表现象对一个百万级的大表执行ADD COLUMN或ADD INDEX命令长时间不返回应用出现大量超时。原因MySQL在执行某些DDL操作特别是早期版本时会对表加写锁阻塞所有其他读写操作。解决方案规划窗口期在业务低峰期操作。使用在线DDL工具对于MySQL 5.6以上版本很多ALTER操作支持ALGORITHMINPLACE, LOCKNONE选项可以在线进行。但并非所有操作都支持。使用第三方工具对于不支持在线DDL的操作或更稳妥的方案使用pt-online-schema-change。它的原理是创建一个影子表同步数据最后通过原子性的重命名操作切换表对业务影响极小。监控在操作前用SHOW PROCESSLIST;查看有无长事务最好先提交或终止它们。4.3 查询突然变慢排查思路检查当前负载立刻执行SHOW PROCESSLIST;看是否有长时间运行的查询或锁等待State列为Waiting for table metadata lock,Locked等。分析慢查询如果已开启慢查询日志立刻分析最近的日志。使用EXPLAIN对变慢的查询语句执行EXPLAIN检查是否走了正确的索引或者出现了全表扫描typeALL。检查索引状态偶尔索引可能会损坏虽然少见。可以用CHECK TABLE table_name;和ANALYZE TABLE table_name;来检查和修复表及索引的统计信息。查看系统资源使用top,htop,vmstat等命令查看服务器CPU、内存、磁盘IO是否饱和。数据库性能问题常常是资源瓶颈的体现。4.4 误操作数据恢复预防胜于治疗开启Binlog确保MySQL的二进制日志binlog是开启的。它记录了对数据的所有更改操作是进行时间点恢复Point-in-Time Recovery, PITR的基础。检查log_bin变量是否为ON。定期备份制定并严格执行备份策略。例如每天一次全量备份每小时一次增量备份或利用binlog。可以使用mysqldump对于超大数据库物理备份工具如Percona XtraBackup是更好的选择。测试恢复流程定期演练从备份中恢复数据确保备份是有效的。如果误删了数据并且有Binlog立即停止应用防止新数据覆盖。找到误操作发生的精确时间点或binlog位置。使用mysqlbinlog工具解析binlog导出误操作之前的SQL或者直接恢复到某个时间点。# 恢复到某个时间点 mysqlbinlog --stop-datetime“2023-10-27 14:30:00” /var/lib/mysql/binlog.000001 | mysql -u root -p这是一个复杂的过程强烈建议在测试环境先模拟演练。4.5 命令行操作小贴士使用\G格式化输出当查询结果字段很多横向显示很乱时在命令末尾加上\G而不是分号结果会按列垂直显示更易读。使用pager设置分页器如果结果集很长可以设置分页器。例如mysql pager less -S这样结果会像less -S一样显示可以横向滚动。用nopager取消。使用tee记录会话如果你希望将整个MySQL会话的操作和输出保存到文件可以在连接后执行mysql tee /path/to/session.log。用notee关闭。查看命令历史在Linux下你的MySQL命令历史通常保存在~/.mysql_history文件中。但注意里面可能包含明文密码如果用了-pPassword的格式要妥善保管。这份“大全”到这里就差不多了它更像是一本随用随查的“案头手册”而不是需要你从头到尾背诵的教科书。真正的熟练来自于在真实的项目和问题中反复使用和思考。我建议你把这份手册保存下来遇到问题时先来这里找找思路和命令比漫无目的地搜索要高效得多。数据库操作谨慎总是没错的尤其是在生产环境任何可能修改数据的命令前加上SELECT确认一下这个习惯可能会在某个关键时刻救你一命。
返回列表