avatar
文章
377
标签
447
分类
12
首页
留言板
知识库
归档
标签
分类
关于
Dai Wei
搜索
首页
留言板
知识库
归档
标签
分类
关于

Dai Wei

MySQL备份与恢复详解:mysqldump、XtraBackup、binlog和PITR
发表于2020-02-10|数据库
备份的目标是可恢复,不是「有个 dump 文件」。逻辑备份、物理备份与 binlog 各管一层。 三类手段 mysqldump:逻辑备份,便携、慢,适合小库或表级迁移。 XtraBackup:热物理备份,适合大库;配合 binlog 做 PITR。 binlog:增量变更日志,按时间点/位点恢复误删数据。 PITR 基本流程 恢复最近全量备份到临时实例。 mysqlbinlog --start-datetime=... --stop-datetime=... 重放增量。 验证后切换或回灌生产。 12mysqldump -uroot -p --single-transaction --master-data=2 app > full.sqlmysqlbinlog --start-position=154 mysql-bin.000012 | mysql -uroot -p app 实践建议定期做恢复演练;备份文件加密与异地存储;监控 binlog 保留天数与磁盘。 权限与脱敏备份文件含全量数据,存储加密、访问审计、定期销毁策略必备。恢复环境应与生产网络隔离...
MySQL自增主键一定是连续的吗?
发表于2020-02-01|数据库
自增 ID「跳号」在 InnoDB 中是常态,不等于数据丢失。弄清机制可避免误报与错误设计。 为什么不连续 回滚:插入成功又 rollback,已分配的 ID 不会回收。 失败重试:唯一键冲突等导致插入失败,自增值可能已递增。 批量插入:innodb_autoinc_lock_mode 影响分配策略,并发下可能交错。 手动指定:插入显式 id 会推进计数器到更大值。 重启:计数器按表中 MAX(id)+1 重新初始化(8.0 行为需结合持久化配置)。 设计启示自增主键适合聚簇索引与插入局部性,但不应作为业务编号(发票号、订单号需独立序列或号段服务)。 12SHOW VARIABLES LIKE 'innodb_autoinc_lock_mode';-- 0/1/2 trade-off между 并发与连续性 实践建议业务展示用雪花 ID/UUID/号段;数据库自增仅作内部 surrogate key。 插入模式与页分裂随机主键(UUID)导致页分裂多、缓冲池利用率差;自增主键顺序插入友好。UUID v7 等时间有序 ID 是折...
MySQL隐式转换造成索引失效
发表于2020-01-23|数据库
WHERE 明明有索引却全表扫描,经常是列类型与常量类型不一致触发隐式转换。 机制说明当比较两侧类型不同时,MySQL 按转换规则把一侧转为另一侧。若对索引列做函数或转换,优化器往往无法使用该索引,因为索引存的是原始值顺序。 典型场景123456789-- phone 为 VARCHAR,常量写数字 → 列被转数字,索引失效SELECT * FROM user WHERE phone = 13800138000;-- 正确写法SELECT * FROM user WHERE phone = '13800138000';-- 对列做函数同样失效SELECT * FROM orders WHERE DATE(created_at) = '2026-01-01';-- 改为范围查询SELECT * FROM orders WHERE created_at >= '2026-01-01' AND created_at < '2026-01-02'; 排查步骤EXPLAIN 看 type&#x...
SQL语句在MySQL中的执行过程
发表于2020-01-14|数据库
搞清 SQL 执行链路,才能理解权限校验、解析、优化、执行与结果返回各阶段在做什么。 执行阶段概览 连接器:TCP 连接、身份认证、权限缓存(修改权限需重连生效)。 查询缓存(8.0 前):相同 SQL 命中缓存;8.0 已移除,不必再依赖。 分析器:词法语法解析,报错 Syntax error 出在这里。 优化器:选择索引、连接顺序、是否使用 ICP/MRR。 执行器:调用存储引擎接口,逐行或索引范围读取。 存储引擎:InnoDB 负责缓冲池、锁、MVCC 与日志。 查询 vs 更新SELECT 可走只读快照;UPDATE/DELETE 需加锁并写 undo/redo。同一连接内语句顺序影响锁持有时间。 实践建议1EXPLAIN FORMAT=TREE SELECT * FROM orders WHERE user_id = 1 AND status = 'PAID'; 用 profiling/performance_schema 看阶段耗时,区分解析慢还是引擎 IO 慢。 Prepared Statement...
一千行 MySQL 学习笔记
发表于2020-01-05|数据库
长篇笔记的价值在于「可检索的操作清单」。本文按连接、DDL/DML、权限与状态查看重组,方便日常查阅。 连接与基础操作12345mysql -h127.0.0.1 -P3306 -uroot -pSHOW DATABASES;USE app;SHOW TABLES;DESC users; DDL 与 DML 要点建表时明确字符集、主键策略与必要索引;更新删除务必带 WHERE 并先 SELECT 验证影响行数。批量变更大表用 pt-online-schema-change 或 gh-ost,避免长时间锁表。 用户与权限最小权限原则:应用账号仅授予所需库的 SELECT/INSERT/UPDATE/DELETE;DDL 与 SUPER 权限隔离给运维账号。 状态诊断入口123SHOW PROCESSLIST;SHOW ENGINE INNODB STATUS\GSHOW VARIABLES LIKE 'innodb%'; 常用信息_schema 查询查表大小、索引Cardinality、未使用索引等可从 infor...
MySQL 专题:索引、事务、日志、备份恢复、MVCC 与性能优化
发表于2019-12-27|数据库
MySQL 是后端核心考点。把索引、执行计划、事务隔离、三大日志连成一条链,慢 SQL 与并发问题才看得懂。 推荐学习顺序索引结构 → EXPLAIN 执行计划 → SQL 执行链路 → 隔离级别与 MVCC → redo/undo/binlog → 备份恢复与规范优化。 核心主题地图 索引:B+ 树、最左前缀、覆盖索引、回表、索引下推。 事务:ACID、四种隔离级别、幻读与间隙锁。 日志:redo 保证崩溃恢复,undo 支撑回滚与 MVCC,binlog 服务复制与 PITR。 性能:慢查询、连接池、规范建表、避免隐式转换。 实践方法每学一章做一个小实验:故意写错索引看 type 变化;开两个事务验证 repeatable read;用 binlog 做一次时间点恢复演练。 常见误区只背八股不做 EXPLAIN;忽略 buffer pool 与磁盘 IO;把分库分表当性能万能药而不先优化 SQL。 工具链配套慢日志、slow_query_log、performance_schema、sys schema、PMM/Grafana 形成闭环。S...
SQL常见面试题总结(5)
发表于2019-12-18|数据库
窗口函数在不折叠行的前提下做排名与累计,是报表与分析 SQL 的利器。MySQL 8.0 起支持完整窗口语法。 窗口函数结构函数 OVER (PARTITION BY ... ORDER BY ...) 1234567SELECT user_id, amount, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at) AS rn, SUM(amount) OVER (PARTITION BY user_id ORDER BY created_at ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cum_amtFROM payments; 常见函数ROW_NUMBER/RANK/DENSE_RANK;LAG/LEAD 取上下行;FIRST_VALUE/NTH_VALUE。 与 GROUP BY 区别GROUP BY 聚合成更少行;窗口函数保留明细行并附加计算列。 实践建议Top-N per grou...
SQL常见面试题总结(4)
发表于2019-12-09|数据库
子查询可读性高但可能被优化成 JOIN。掌握 EXISTS 与 IN 的差异,避免 correlated subquery 性能陷阱。 子查询分类标量、列、表、相关子查询。相关子查询每行外层执行一次,数据量大时极慢。 EXISTS vs IN123456-- EXISTS 找到即停,常优于大 IN 列表SELECT * FROM users uWHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id);-- NOT IN 注意 NULL:子查询含 NULL 可能全 falseSELECT * FROM users WHERE id NOT IN (SELECT user_id FROM banned WHERE user_id IS NOT NULL); CTE(8.0+)1234WITH recent AS ( SELECT * FROM orders WHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY))SELECT user_id, COUNT(*)...
SQL常见面试题总结(3)
发表于2019-11-30|数据库
连接是关系型威力所在。理解笛卡尔积、内连接与外连接的差异,避免「连完行数爆炸」。 JOIN 本质先产生行组合再过滤。无 ON 条件的 JOIN 即笛卡尔积,行数 = 各表行数乘积。 1234SELECT o.id, u.nameFROM orders oINNER JOIN users u ON o.user_id = u.idWHERE o.created_at >= '2026-01-01'; 外连接LEFT JOIN 保留左表无法匹配的行(右列 NULL);用于「查所有用户及其 optional 订单」。 UNION vs UNION ALLUNION 去重合并;UNION ALL 保留重复行,性能更好。 实践建议连接列建索引;小表驱动大表是优化器工作,写法上保证 ON 条件 selective。 SEMI/ANTI JOINEXISTS 是 semi join;NOT EXISTS 是 anti join。优化器可能转为 hash join。 自连接树形结构 employee-manager 用自连接或递归 CTE(8....
SQL常见面试题总结(2)
发表于2019-11-21|数据库
聚合题考的是「一行变多行统计」的分组边界。HAVING 与 WHERE 的分工必须讲清楚。 聚合函数SUM/AVG/MAX/MIN/COUNT 对一组行归约;与 GROUP BY 联用;无 GROUP BY 时全表一行聚合。 WHERE vs HAVINGWHERE 在分组前过滤行;HAVING 在分组后过滤组。想过滤聚合结果必须用 HAVING。 12345SELECT dept_id, AVG(salary) AS avg_salFROM employeeWHERE status = 'ACTIVE'GROUP BY dept_idHAVING AVG(salary) > 15000; WITH ROLLUP生成小计/总计行,报表场景有用,注意 NULL 与 super-aggregate 标识。 FILTER 子句标准 SQL FILTER (WHERE …) 部分库支持;MySQL 用 SUM(CASE WHEN…) 模拟条件聚合。 空组GROUP BY 无匹配行时不返回行;需要零行报表用 ...
1…242526…38
avatar
Dai Wei
软件开发者,记录技术探索与实践
文章
377
标签
447
分类
12
Follow Me
公告
分享软件开发、工程实践与持续学习中的思考。
最新文章
Trae + MiniMax 多场景实战:Redis 故障排查与跨语言重构2026-08-28
Kimi K3 实战:全栈项目、Java 项目改造与 3A 游戏 Demo2026-08-23
测试开发学习路线(2026 最新版):AI 时代如何从测试走向质量工程2026-08-20
IDEA + Qoder 插件多场景实战:接口优化与代码重构2026-08-18
DeepSeek V4 + Claude Code 实战:代码能力深度测评2026-08-14
分类
  • AI 编程28
  • Java103
  • 人工智能39
  • 分布式系统26
  • 学习路线5
  • 开发工具11
  • 数据库42
  • 系统设计26
标签
线程优先级 DBMS 大模型 Java基础 命令 Top K 安全 Loop 计算机网络 Raft 贪心 修饰权限 TCC 最终一致性 召回 网络编程三要素 服务调用 分布式理论 知识体系 复杂度 红黑树 Unsafe 面试 Java26 BASE 内存管理 语音 redo log Kimi NoSQL Seata CAS 优化器 RDB 线程通信 面试题 IDE 死锁 ZAB 编排
归档
  • 八月 2026 7
  • 七月 2026 7
  • 六月 2026 6
  • 五月 2026 7
  • 四月 2026 6
  • 三月 2026 4
  • 二月 2026 5
  • 一月 2026 5
网站信息
文章数目 :
377
本站访客数 :
本站总浏览量 :
最后更新时间 :
© 2017 - 2026 By Dai Wei框架 Hexo 8.1.2|主题 Butterfly 5.7.0
搜索
数据加载中