网站首页 包含标签 事务 的所有文章

  • 主从延时的原因及解决方案

    主从延迟情况 我们先看看,哪些情况会导致主从延时: 从库机器性能:从库机器比主库的机器性能差,只需选择主从库一样规格的机器就好。 从库压力大:可以搞了一主多从的架构,还可以把 binlog 接入到 Hadoop 这类系统,让它们提供查询的能力。 从库过多:要避免复制的从节点数量过多,从库数据一般以3-5个为宜。 大事务:如果一个事务执行就要 10 分钟,那么主库执行完后,给到从库执行,最后这个事务可能就会导致从库延迟 10 分钟啦。日常开发中,不要一次性 delete 太多 SQL,需要分批进行,另外大表的 DDL 语句,也会导致大事务。 网络延迟:优化网络,比如带宽 20M 升级到 100M。 MySQL 版本低:低版本的 MySQL 只支持单线程复制,如果主库并发高,来不及传送到从库,就会导致延迟,可以换用更高版本的 MySQL,支持多线程复制。 主从延时解决方案 面试时,有些同学能回答出使用缓存、查询主库、提升机器配置等,仅仅这些么? 最容易想到的方法,缩短主从同步时间: 提升从库机器配置,可以和主库一样,甚至更好; 避免大事务; 搞多个从库,即一主多从,分担从库查询压力; 优化网络宽带; 选择高版本 MySQL,支持主库 binlog 多线程复制。 也可以从业务场景考虑: 使用缓存:我们在同步写数据库的同时,也把数据写到缓存,查询数据时,会先查询缓存,不过这种情况会带来 MySQL 和 Redis 数据一致性问题。 查询主库:直接查询主库,这种情况会给主库太大压力,核心场景可以使用,比如订单支付。 如果能把上面基本回答出来,就已经非常厉害了,还有么? 其实还可以在 MySQL 架构上来考虑。 主库对数据安全性较高,设置配置如下: sync_binlog = 1 innodb_flush_log_at_trx_commit = 1 而 slave 不需要这么高的数据安全,完全可以将 sync_binlog 设置为 0,或者关闭 binlog,innodb_flushlog 也可以设置为 0,来提高 sql 的执行效率。 架构方案:使用多台 slave 来分摊读请求,再从这些 slave 中取一台专用的服务器,只作为备份用,不进行其他任何操作,比如设置 sync_binlog 为0,或者关闭 binglog 等,提升从库查询性能。 ...

    2023-11-03 191
  • MySQL数据库事务是什么

    什么是事务 数据库的事务是一种机制,一个操作序列,包含了一组操作命令 事务把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令,要么同时成功,要么同时失败 事务是一个不可分割的工作逻辑单元 为什么需要事务 事务的主要目的是确保数据库操作的一致性和完整性。下面是一个简单的例子来解释为什么需要事务。 假设有一个银行系统,其中有两个账户 A 和 B,当前账户 A 的余额为 1000 元,账户 B 的余额为 2000 元。现在有两个用户同时进行转账操作,一个用户从账户 A 向账户 B 转账 500 元,另一个用户从账户 B 向账户 A 转账 700 元。 如果没有事务的支持,那么这两个转账操作可以并发执行,可能会导致以下问题: 并发问题:在没有事务的情况下,两个用户同时进行转账操作时,可能会出现竞争条件。例如,如果用户 A 首先读取账户 A 的余额为 1000 元,在用户 B 读取账户 B 的余额为 2000 元之前执行转账操作,那么用户 A 的转账操作会以账户 A 余额为 1000 元进行计算,导致账户 A 的余额不正确。 数据不一致:如果两个转账操作不在同一个事务中,当第一个转账操作成功并提交后,而第二个转账操作失败并中止,会导致账户 A 和账户 B 的余额不一致。 数据丢失:如果没有事务支持,当一个转账操作成功时,另一个转账操作发生错误并中止,导致其中一个用户的转账款项丢失。 通过使用事务,可以解决上述问题。事务可以确保这两个转账操作要么全部成功,要么全部失败。 如果其中一个转账操作失败,事务可以回滚到事务开始之前的状态,保证数据的一致性。 同时,事务还可以提供隔离性,使得并发执行的转账操作相互不影响。 事务的四大特性 ...

    2023-11-02 169
  • MySQL: Binlog复制如何安全地跳过错误事务

    MySQL是一个功能强大的开源关系数据库管理系统,它提供了二进制日志(Binlog)复制功能,帮助数据库管理员在主从架构中同步数据。 然而,在实际运营过程中,可能会遇到由于某些错误事务而导致复制过程中断的情况。 在确认是单独的错误事务导致问题后,我们可以在从服务器(Slave)上采取措施来跳过该错误事务,然后继续复制过程。 首先,我们需要停止从服务器上的复制过程,以确保不会有新的数据被复制过来。 可以通过执行以下命令来停止复制: STOP REPLICA; 接下来,我们需要设置全局变量sql_slave_skip_counter,以指定要跳过的错误事务数量。 通常情况下,如果只有一个错误事务,我们可以将该变量设置为1: SET GLOBAL sql_slave_skip_counter = 1; 然后,我们可以重新启动复制过程,以继续复制后续的事务: START REPLICA; 为了验证我们的操作是否成功,可以通过以下命令检查复制的状态和sql_slave_skip_counter的值: SHOW REPLICA STATUS\G show variables like 'sql_slave_skip_counter'; 一旦复制应用启动,GLOBAL sql_slave_skip_counter变量会被重置为0。这意味着,如果在将来再次遇到需要跳过的错误事务,我们需要再次设置这个变量。 虽然我们可以将sql_slave_skip_counter设置为一个非常大的值,以确保启动后所有错误都会被忽略,但这并不是一个推荐的做法。这样做可能会忽略掉所有的错误事务,包括那些可能会影响数据完整性或系统稳定性的重要错误,甚至会错过正常的事务导致数据丢失。 因此,通常建议仅在清楚知道错误事务的性质和影响时,才使用sql_slave_skip_counter来跳过错误事务。 总结来说,通过理解和应用sql_slave_skip_counter变量,我们可以在遇到错误事务时,有选择地跳过它们,以保持复制过程的连续性。 但同时,我们也应该注意不要滥用这个功能,以避免产生不可预见的问题。 在处理复制错误时,应该先尝试找出并解决错误的根本原因,而不是简单地跳过错误事务。 通过这样的实践,我们可以确保我们的MySQL复制环境更加健壮和可靠。 ...

    2023-10-22 203

联系我们

在线咨询:点击这里给我发消息

QQ交流群:KirinBlog

工作日:8:00-23:00,节假日休息

扫码关注