- 博客(7574)
- 资源 (9)
- 收藏
- 关注
原创 -ProxySQL:数据库高可用了,应用高可用怎么做?
在应用程序和后端MySQL之间,增加一层Proxy,可以向应用屏蔽掉后端MySQL主备切换的一些细节。这样对应用程序而言,使用起来更加方便。同时,Proxy还可以起到连接池的作用。这里,其实还有一个问题没有解决,就是后端的MySQL怎么切换?早期比较有名的是MHA工具。在云上,各个云厂商提供的RDS高可用版本,一般都标配了数据库自动切换的功能。如果是自建的环境,你可以调研下一些开源的工具,比如MHA、Orchestrator等。如果数据库的数量有一定的规模,你也可以考虑自己实现一个数据库自动切换的工具。
2025-08-11 10:42:37
417
原创 -MySQL 8.0 组复制技术的应用(下)
组复制技术通过Paxos算法,保证了事务在一个节点提交时,事务消息被集群中的大多数节点接收到。在读写分离的架构下,为了确保在备节点上能读到一致的数据,可以在备节点上将参数group_replication_consistency设置成BEFORE。虽然MGR集群支持多主模式,但是整个集群的写入能力受流控机制的限制。和单主模式相比,多主模式并没有特别大的优势。从架构的简单性考虑,如果使用MGR,建议使用单主模式。
2025-08-11 10:31:37
366
原创 -MySQL 8.0 Clone 插件的应用和内部原理
MySQL 8.0.17版本引入了clone插件。使用Clone插件可以对本地或远程的mysql实例进行克隆操作。Clone插件会拷贝InnoDB存储引擎表,克隆得到的是数据库的一个一致的快照,可以使用这个快照数据来启动新的数据库实例。Clone插件还会记录数据库的Binlog位点,可以将克隆得到的实例作为源实例的备库。Clone插件支持本地克隆和远程克隆这两种模式。本地克隆将数据存放在源数据库所在主机上。
2025-08-11 10:13:30
446
原创 -数据误操作了如何快速恢复?
在备份系统的设计中,要把Binlog备份也考虑进去,有了完整的Binlog,你可以将数据库恢复到任意一个时间点。在有些场景下,使用Binlog回滚的方案,能加快数据恢复的速度,减少业务的故障时长。针对可能存在的数据丢失故障,你可以有计划地进行恢复演练,这不仅能验证备份和数据恢复方案的有效性,还能给恢复时长建立一个基线。这样,当需要紧急恢复数据时,你可以比较精确地估算出恢复需要多少时间。
2025-08-11 10:03:49
333
原创 -备库服务器异常重启,备库损坏了该如何修复?
数据库和服务器有时难免会出现异常,如果备库异常重启了,怎么保证数据复制还能正常进行下去呢?建议的做法是使用GTID Auto Position,这样,即使slave_master_info表里的位点信息没及时更新也没有影响,relay log损坏了也没有关系。否则,你需要将参数sync_source_info设置为1,确保读取主库Binlog的位点是准确的。使用多线程复制时,还要将参数sync_relay_log设置为1,保证Relay log及时刷新,这对性能会有比较大的影响。
2025-08-08 14:09:29
478
原创 -备库有延迟怎么办?
使用MySQL的数据复制功能时,要监控好备库的状态和延迟情况。很多原因都会导致备库延迟,这一讲中提供了一些基本的方法。有一些延迟问题是可以避免的。如果是因为主库写入并发高引起的延迟,使用多线程复制能在一定程度上降低延迟。主库上参数binlog_transaction_dependency_tracking设置为WRITESET,能提升事务在备库的可并行度。如果你使用了级联复制架构,中间层的实例上,也要将 binlog_transaction_dependency_tracking设置为WRITESET。
2025-08-08 13:46:41
728
原创 -MySQL半同步能提高主备数据的一致性吗?
好了,这一讲中,我们分析了MySQL事务的二阶段提交。使用默认的异步复制,在极端情况下,主备数据可能会出现不一致。sync_binlog设置为1时,可以保障主库的数据一致性。半同步可以部分提升主备之间的数据一致性,开启半同步会有一些性能开销,使用半同步需要做好监控。
2025-08-08 13:24:12
741
原创 MySQL数据库高可用架构部署和维护
数据复制是MySQL一直以来最受欢迎的功能之一。应用程序访问主库,对主库的修改操作都记录到Binlog中。备库从主库同步Binlog、执行Binlog,这样,备库和主库始终保持一致。基于数据复制,可以实现多种高可用架构。高可用应用程序只访问主库,备库作为主库的热备。当主库发生故障,或者主库需要停机维护时,将业务流量切到备库上,减少停机时间。在备库上进行数据库备份等运维操作。读写分离将应用的一部分读流量分发(select)到备库上执行。
2025-08-08 12:58:02
899
原创 隔离级别对应用程序有什么影响?
锁是数据库中很重要的一个机制。MySQL中,我们主要会关注元数据锁和InnoDB的行锁。这一讲中,我们对行锁做了比较详细的介绍。REPEATABLE READ隔离级别下,使用了Gap锁、Next-key锁,锁的范围更大,因此也更容易引起死锁。应用程序遇到锁的问题时,首先要确定是锁超时还是死锁。你可以查询data_locks、data_lock_waits表来分析锁等待关系。
2025-08-08 11:35:03
626
原创 隔离级别对应用程序有什么影响?
MVCC是InnoDB的一个重要机制,通过MVCC,MySQL实现了读不阻塞写,写不阻塞读。当然,由于MySQL的实现机制,如果事务一直没提交,Read View一直开着,会导致Undo一直不能清理,Undo表空间就会一直增长,影响数据库的性能,所以需要做好监控。
2025-08-08 11:16:25
939
原创 -事务怎么回滚?(下)
通过上一讲和这一讲,你应该已经知道MySQL中Undo的原理和作用了。在写入特别繁忙的数据库中,清理(Purge)Undo日志可能会成为制约数据库性能的一个重要因素。建议把History链表长度监控起来。有一些Purge相关的参数可以配置,具体信息可以参考官方文档。Undo还在事务的一致性读取(MVCC)中起到重要的作用,我们在下一讲中再介绍。
2025-08-08 11:06:38
953
原创 事务怎么回滚?(上)
MySQL中,事务的行为受参数autocommit影响。如果autocommit设置为ON(这个参数默认就是ON),那么每个SQL语句会组成单独的事务,SQL语句执行完成时,InnoDB自动提交或回滚事务。autocommit设置为ON时,你也可以使用BEGIN或START TRANSACTION语句开启事务,开启事务后,可以在一个事务中执行多条SQL语句,你需要执行COMMIT语句提交事务,或使用ROLLBACK语句回滚事务。如果事务中的SQL执行时报错了,MySQL会怎么处理呢?
2025-08-07 12:58:11
552
原创 -数据都在内存里修改,服务器或数据库宕机会丢数据吗?
这一讲中我们对InnoDB的REDO机制做了一些基本的介绍,其中有几个参数需要注意。innodb_flush_log_at_trx_commit:设置为1的时候,才能保证数据不丢。innodb_log_buffer_size:Log Buffer一般设置几十M到几百M。
2025-08-07 12:52:45
844
原创 InnoDB Buffer Pool如何提高数据库性能?(下)
这一讲中,我们介绍了执行DROP TABLE、TRUNCATE TABLE、DROP INDEX等DDL操作时,InnoDB内部进行的一些处理,包括清理AHI、删除表空间、回收索引段的空间。如果你使用的版本小于8.0.23,那么执行这些DDL时对性能可能会有比较大的影响,特别是把Buffer Pool设置得比较大的实例。InnoDB还使用了自适应hash索引、Change Buffer来提升性能,我们也做了一些介绍。Double Write Buffer是用来保证数据一致性的,有一定的性能开销。
2025-08-07 12:49:30
796
原创 -InnoDB Buffer Pool 如何提高数据库性能?(上)
这一讲中我们对InnoDB Buffer的结构做了一些介绍。在实践中,要正确地设置相关的参数。对性能影响最大的参数应该是innodb_buffer_pool_size和innodb_buffer_pool_instances,你可以参考第4讲中的相关内容。为了保证数据库的事务ACID属性,修改Buffer Pool中的数据时,要生成REDO和UNDO日志,修改记录时还需要先获取行锁,这是接下来几节课要介绍的内容。
2025-08-07 12:46:35
973
原创 -数据库无法启动,如何读取InnoDB文件中的数据?(下)
这一讲中,我们通过一个具体的例子,解析了InnoDB聚簇索引和二级索引的存储格式,你可以看到,我们之前关于InnoDB表和索引结构的描述,都是有依据的。我们还看到了InnoDB管理段和空间的一些数据结构,包括段描述符、区描述符、Inode页面。InnoDB数据文件中,藏着很多链表结构,有单向链表,还有双向链表,后续的课程中,还有更多的链表结构等我们去发现。
2025-08-07 11:55:51
385
原创 数据库无法启动,如何读取InnoDB文件中的数据?(上)
解读ibd文件的内容,需要借助一些工具,以十六进制的方式查看文件的内容。这类工具很多,比如UltraEdit。这里我使用了Mac系统下的Hex Fiend。下面这个图就是使用Hex Fiend打开t_dynamic.ibd文件后显示的内容。上面这个图里面,最左侧和最上方是地址栏,标注了文件内容的偏移量。右侧是提示区,以文本的形式展示文件内容。我们建的测试表里,存的都是文本数据,在提示区里能看到这些数据。
2025-08-07 10:55:35
274
原创 SQL执行性能不佳的真实案例(下)
SQL优化是一项基本的技能。你需要掌握索引的特点,了解不同表连接算法的特点和适用场景,还需要了解优化器的一些工作原理。有的时候你可能需要改写SQL,或者使用SQL提示,来获得更好的性能。这两讲的十几个例子,都是从真实的业务场景中挑选出来的,当时使用的版本包括5.5、5.6、5.7。可以看到,在8.0中,有一些SQL实际上优化器已经能自动优化得更好了。这也是我们要使用新版本的一个重要的原因。
2025-08-07 10:52:02
384
原创 SQL执行性能不佳的真实案例(上)
这一讲的六个案例,在平时工作中比较常见,通常也比较容易解决。首先要理解索引的选择性,为查询中过滤性高的条件创建合适的索引。对于隐式类型转换,最重要的是要在建表的时候就选择精确的数据类型,避免使用varchar来存储数字类的、日期时间类的数据。字符集也要保持一致。如果表已经建好,系统已经上线运行了,那就要在应用代码里使用和字段类型匹配的数据类型。
2025-08-07 10:42:26
361
原创 MySQL子查询优化策略
按官方文档的说法,MySQL 8.0.17开始,对于满足半连接转换条件的not in、not exists查询,MySQL还会使用反查询(ANTI Join)转换。但是在我的测试中,not in的执行计划中仍旧是相关子查询(DEPENDENT SUBQUERY)。给主查询的not in字段加上not null条件后,查询才转换成了反连接。Not exists;Code: 1003关于反连接,有一点需要注意,就是not in和not exists并不完全等价。
2025-08-06 13:10:42
533
原创 -表连接如何执行?
这一讲中,我们学习了MySQL中表连接的几种方法。优化器会评估不同的连接顺序和连接方法的成本,从中选择一个成本最低的执行计划。在有些情况下,优化器选择的执行计划,在执行时并不是效率最高的,这时就需要我们分析SQL中相关表的索引结构和统计信息,查看表的数据分布情况,想办法让优化器选择效率更高的执行计划。子查询、半连接(Semi Join)、反连接(Anti Join)的内容呢,我们放到下一节课再讨论。
2025-08-06 12:54:00
596
原创 单表查询:如何评估单表访问成本?
结合上一讲的内容,我们已经把单个表的访问做了比较全面地介绍。索引在SQL优化中有非常重要的作用。平时在建索引时,有几个问题需要考虑,一是应该把哪些字段加到索引中,二是索引中字段的顺序如何排列。我们需要考虑索引的过滤性,这里是指索引前缀字段组合的过滤性。还要根据业务的数据分布情况和访问需求,综合考虑。每新增一个索引都会带来额外的维护成本,因此我们要避免创建重复的索引。尽量使用一些精炼的索引来满足业务的查询需求。
2025-08-06 12:52:58
882
原创 -优化器成本模型:优化器为什么选择这个执行计划?
这一讲中,我们学习了MySQL优化器的一些工作原理。优化器会选择成本最低的执行计划。我们介绍了全表扫描和索引范围扫描这两种最基本,也是最重要的访问路径的成本计算方法。实际工作中优化SQL时,我们并不需要真的知道某个执行计划的成本,那是优化器要计算的。但是我们需要理解全表扫描和索引访问大致的原理,理解这两种执行计划的开销来自哪里。统计信息对优化器很重要,如果统计信息不准确,优化器很可能会选择错误的执行计划。我们还可以通过优化器参数、SQL提示来影响优化器。
2025-08-06 12:50:08
767
原创 读懂MySQL中的执行计划(下)
出于完整性的考虑,这一讲中我们使用了四十多个SQL语句,演示并解释了MySQL执行计划的各种输出。在实际工作中,一般也不会遇到这里的每一种情况。通过ID、SELECT_TYPE、TABLE这几列可以了解语句整体的连接、嵌套结构。TYPE列为ref、range时,才是我们平时说的用到了索引。type为index时,实际上是使用了全索引扫描。ROWS列是优化器评估的需要从到存储引擎里访问的记录的数量,这个数量对性能有直接的影响。
2025-08-06 12:47:00
991
原创 读懂MySQL中的执行计划(上)
你好,我是程序员贵哥。上一讲我介绍了数据库中最主要的几种访问路径,不同的访问路径,在执行性能上可能会存在巨大的差别。但是我们怎么知道某一个具体的SQL语句在执行时,采用了什么样的访问路径呢?这就涉及到SQL的执行计划了。在MySQL中,我们使用Explain命令查看语句的执行计划。这一讲中我会使用四十多个演示SQL,来解释EXPLAIN输出信息的具体含义。至于为什么一个SQL使用了这个执行计划,而不是别的执行计划,我会在接下来的几讲中慢慢展开。
2025-08-06 12:39:29
984
原创 -SQL优化第一步:理解访问路径
这一讲中,我们学习了数据库中最重要的几种访问路径:全表扫描、索引访问、表连接。理解这些内容,能帮你更好地掌握SQL优化。当然,一个SQL语句,并不是说用了索引性能就一定好,不用索引性能就一定不好。优化器会根据具体的情况来进行评估要不要使用索引、使用哪些索引,对于表连接,优化器还需要确定连接的顺序和连接的算法,这些内容在接下来的几讲中揭秘。
2025-08-06 11:16:17
646
原创 如何在不影响业务的情况下平滑升级MySQL?
这一讲我们介绍了MySQL物理升级的操作步骤。一般我会优先选择使用物理升级,因为这样通常速度更快。升级前要做好充分的测试验证,并根据数据库的部署架构,选择合适的升级顺序。**版本降级的成本更高,我们要尽量避免这种情况。**如果实在是需要降级,要考虑用老版本数据库最近的一个备份文件来恢复数据库,或者通过数据导入导出的方式,将数据从新版本迁移到老版本。在使用生产环境的真实数据恢复出来的验证环境做业务测试的时候,有一点需要特别注意,不要影响线上业务。
2025-08-06 10:28:56
907
原创 非典型数据库故障解析:数据库故障一定是数据库的锅吗?
这是我们公司服务的一家客户在线业务系统中发生的故障。这家客户提供在线支付业务,大量的消费者日常都会使用到这项服务。比如我们中午或傍晚到店里扫码点餐付款时,或者在商场里扫码付款时,都可能会用到这项服务。当时,我们给这家公司提供了数据库运维保障的服务。客户的核心业务数据库采用了国内头部的一家云厂商提供的RDS for MySQL产品。有一天下午,快接近6点钟的时候,短促的告警声打破了办公室的平静,客户的告警通知群里面,出现了大量的实例CPU和活跃会话数的告警消息。
2025-08-05 11:12:21
566
原创 -Linux问题诊断入门:操作系统是否存在瓶颈?
Linux是一个功能强大的操作系统,也有一定的复杂度。在这一讲中,我们分别介绍了系统中几大类资源的基本评估方法。一般在分析操作系统相关问题时,我们会考虑几个问题。是否有资源达到了瓶颈。比如CPU是不是打满了,网络带宽是否用满了,是否有大量内存页面换入换出,文件系统空间或Inode是否用完了。硬件是否有性能降级的情况。比如CPU是否运行在节能模式下,硬盘是否存在故障,RAID卡电池是否在充放电。跟软件故障相比,硬件故障的概率可能更低,但是硬件一旦有故障,就可能对性能造成严重的影响。
2025-08-05 11:09:33
630
原创 -定位MySQL问题的思路:数据库为什么慢了?
这一讲中,我们学习了分析和诊断MySQL问题的一个通用框架。有多种不同的原因都会导致MySQL出问题。有可能是运行MySQL的环境本身存在性能瓶颈。有可能是MySQL在忙着执行各种SQL,可能是SQL执行频率太高,也可能是有的SQL扫描了太多的数据。有可能是一个会话长时间持有锁,无意间锁死了大量会话。有可能是并发太高,内部资源存在严重的争用现实中,也很可能会同时遇到上面的多种情况。当然在另外一些情况下,问题不是出在数据库上,而是出现在访问数据库的客户端。
2025-08-05 11:04:30
855
原创 -表太大了,修改表结构太慢怎么解决?(上)
这一讲中,我们讨论的是通常执行速度很快的这一类DDL,也就是只需要修改元数据的DDL。Instant DDL是MySQL 8.0增加的快速加列特性,可以快速地给大表增加字段。当然,还有一些DDL,执行期间的开销会比较大,这一讲的下篇中,我们再来详细讨论。
2025-08-05 10:52:22
866
原创 MySQL如何快速导入导出数据?
这一讲我们学习了mysqldump和MySQL Shell的Dump工具。mysqldump将数据库导出成一个SQL文件,在数据库非常大的情况下,导入这个SQL文件可能需要花很长的时间。MySQL Shell的Dump工具可以并行导出,并且每个表的数据会导出到单独的文件中,这便于你进行并行导入,也便于你只导入部分表。关于MySQL Shell Dump导出的数据应该如何导入,会在这一讲的下篇中详细介绍。
2025-08-05 10:39:14
613
原创 -程序访问数据库内存溢出怎么解决?
这一讲中,我们一起学习了MySQL客户端和服务端的交互过程,分析了MySQL处理结果集的两种方式,以及查询大表为什么会引起客户端内存溢出。对于Java程序,我们可以使用Heapdump分析,找到返回大量数据的那些SQL。如果业务中有SQL返回了太多的数据,一般我建议先从业务上进行分析,业务是否真的需要查询这么多数据?是不是可以将SQL改写成分页的方式,一次只查询一部分数据?
2025-08-05 10:29:44
887
原创 -乱码是怎么产生的,以及如何避免?
在这一讲中,我们学习了文本编码和解码的一般过程,以及乱码产生的几种情况。我们还学习了MySQL如何处理文本编码,以及在使用MySQL时你可能会遇到的几种乱码问题,并给出了相应的解决方法。最后总结一下几个关键点。根据需要存储和处理的文本类型决定使用哪种字符集。一般如果要处理中文,可以选择GBK或UTF8字符集。GBK使用双字节存储一个汉字,在空间上有一定的优势。UTF8适用性更广。客户端需要设置正确的字符集。字符集的设置要和程序中数据的实际编码保持一致。
2025-08-05 10:21:12
997
原创 -SQL Mode对程序有怎样的影响?
设置SQL_MODE可能会使原先能执行的SQL无法执行,也可能影响数据写入操作,因此在生产环境修改这个参数前,需要对应用进行完整的测试验证。如果你进行了数据库迁移或升级,新环境数据库sql_mode和原先的设置不一样,也可能引起应用程序出错。因此需要注意迁移或升级前后sql_mode的设置。MySQL 5.7开始,sql_mode的默认设置跟之前的版本相比,有很大的改动,如果你是从更早的版本升级过来,需要特别注意。
2025-08-04 11:12:45
992
原创 -你用对数据类型了吗?
设计表结构时,需要根据业务的需求,选择合适的数据类型,我们需要考虑几点。选择精确匹配业务需求的数据类型。如时间和日期类型的数据使用TIMESTAMP或DATETIME类型,整数类的数据使用INT系列类型,文本类型的使用VARCHAR类型。要关注数据类型的空间占用情况。在满足业务存储需求的前提下,优先使用空间占用更小的类型。比如业务中最多几十种状态,我们就可以使用tinyint类型,而不使用int或bigint。VARCHAR的长度要按实际需求设置。
2025-08-04 11:08:18
543
原创 -MySQL中不同类型的参数与参数配置
这一讲中,我们一起学习了MySQL的参数设置机制。我建议将一个数据库实例的参数都配置在同一个参数文件中。修改参数时,在参数文件中添加注释,简要说明参数这么设置的原因。有可能的话,使用版本控制工具来管理参数文件。MySQL只需要配置最基本的参数就能运行起来。但如果对性能和数据一致性有要求,就需要设置一些重要的参数,比如我们在这一讲中讨论到的资源限制参数、InnoDB的一些参数。我们很难给MySQL设置真正意义上最优的参数,而且在不同的业务场景下,最优的配置可能是不一样的。
2025-08-04 11:04:14
1085
原创 -数据库连接问题诊断分析
这一讲中,我们学习了MySQL建立连接和认证用户的过程。有很多原因会导致连接数据库失败,遇到问题时首先要拿到数据库具体的报错信息、错误编号。这一讲我也提到了一些你可能会遇到的报错信息。如果你遇到的连接问题在课程中没有提到,可以根据我们提供的步骤,分析连接的哪个阶段出现了问题。此外我们还分析了数据库连接异常中断的一些情况。通过正确设置数据库参数、代理软件参数和应用程序的连接池参数,可以避免一部分连接中断的问题。应用程序也要有能力处理中断的连接,进行重连、重试。
2025-08-04 10:51:05
836
原创 -MySQL账号和权限管理
这一讲我们学习了MySQL用户和权限管理。MySQL的用户由用户名和主机名两部分组成。用户名相同,但主机名不同的多个用户,实际上是完全独立的用户,为了便于管理,要尽量避免创建这样的用户。如果你要限制数据库只允许某些IP访问,可以考虑从网络防火墙层面来限制。用户密码应该要有一定的复杂度,可以启用密码验证组件,防止给数据库用户设置过于简单的密码。授权时,要遵循最小权限原则,给用户授予正常业务需求之外的权限会带来额外的安全风险。
2025-08-04 10:42:29
1438
原创 -快速上手数据库安装部署
这一讲我们学习了在Linux操作系统下安装MySQL的几种方法。如果你需要安装部署大量MySQL服务器,我个人比较推荐使用二进制的方式安装。你需要制定一个标准规范,包括二进制安装路径、数据文件存放路径、服务器和数据库的标准参数配置等,并且按这个标准来部署所有的MySQL环境。
2025-08-04 10:21:27
344
Linux系统技术可以学习一下
2024-01-26
播为主播提供一站式直播必备工具 包含弹幕助手、屏幕美化、语音播报、弹幕点歌等主播必备核心功能,目前已支持虎牙、斗鱼,抖音等、平台
2023-10-13
TestSyncMethods.java
2021-07-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人