MySQL学习总结--WAL日志

2023-10-31

WAL

  • Write-Ahead Logging 技术,是指先写日志和内存,等不忙的时候再写磁盘,作用是将随机写变成顺序写,减少写盘消耗,还能用于实现 crash-safe。
  • WAL 能减少磁盘写要得益于两个方面:
    • redo log 和 binlog 都是顺序写,磁盘的顺序写比随机写速度要快。
      • 随机写:本次写磁盘的扇区和上一次没啥关系,需要重新定位位置。
      • 顺序写:本次写磁盘的扇区就在上一次的下一个位置,不需要重新定位。
    • 组提交机制,可以大幅度降低磁盘的 IOPS 消耗。
  • 术语
    • flush 一般是说刷脏页
    • purge 一般是指清除 undo log
    • merge 一般是指应用 change buffer

redo log VS binlog

  • redo log 是 InnoDB 引擎特有的用于 crash-safe 的重做日志;binlog 是 MySQL 的 Server 层实现的归档日志,没有 crash-safe 的能力,所有引擎都可以使用。
  • redo log 是循环写的,空间固定会用完,不能用做归档;binlog 是追加写入的,写到一定大小后会切换到下一个,并不会覆盖以前的日志,可以用做归档。
  • redo log 是物理日志,记录的是“在某个数据页上做了什么修改”;binlog 是逻辑日志,记录的是这个语句的原始逻辑,例如 SQL 语句或数据行字段值的变更。

日志的两阶段提交

  • 两阶段提交就是让 redo log 和 binlog 所记录的事务提交状态保持逻辑上的一致。否则,误删恢复时可能出现前后不一致,扩容从库时可能出现主从不一致。
  • 核心:把写 redo log 拆分成两个阶段:prepare、commit 状态。
  • 执行顺序:写 redo log(prepare 状态) -> 写 binlog -> 写 redo log(commit 状态)
  • 崩溃恢复时,会按顺序扫描 redo log:
    • 如果碰到既有 prepare、又有 commit 的 redo log,就直接提交。
    • 如果碰到只有 prepare、而没有 commit 的 redo log,就拿两个日志的共同字段 XID 去 binlog 找对应的事务。
  • 实现过程:写操作事务执行过程中,日志会分别写入 redo log buffer 和 binlog cache ,而执行 commit 命令 或 autocommit 时,才会发生日志的两阶段提交。
    • 更新内存数据页
    • 写入 redo log:把 redo log buffer 内容记为 prepare 状态,调用 write page cache。
    • 写入 binlog:把 binlog cache 内容,调用 write page cache。
    • 落盘 redo log:对 prepare 状态的 redo log 调用 fsync。为了利用 redo log 组提交机制节约磁盘 IOPS ,MySQL把落盘步骤往后放,让 fsync 尽量晚调用。
    • 落盘 binlog:对 binlog 调用 fsync。为了利用 binlog 组提交机制节约磁盘 IOPS ,MySQL把落盘步骤往后放,让 fsync 尽量晚调用。
    • 改写 redo log 状态:把 redo log 改为 commit 状态,调用 write page cache。
  • 写入 VS 落盘
    • write 指的就是指把日志写入到文件系统的 page cache(文件系统的内存),此时数据还没有持久化到磁盘,所以速度比较快。
    • fsync 才是持久化到磁盘,一般认为 fsync 才占磁盘的 IOPS。

组提交机制(group commit)

  • 一次组提交里面,组员越多,节约磁盘 IOPS 的效果越好。为了让一次 fsync 带的组员更多,MySQL 的优化是:拖时间。
  • 日志逻辑序列号LSN(log sequence number):是单调递增的,用来对应 redo log 的一个个写入点。每次写入长度为 length 的 redo log, LSN 的值就会加上 length。LSN 也会写到 InnoDB 的数据页中,来确保数据页不会被多次执行重复的 redo log。
    • 假设事务 trx1(LSN 50)是第一个提交的,会被选为这组的 leader。
    • 等事务 trx1 要开始写盘的时候,这个组里面已经有了三个事务,其中 trx3(LSN=160)。
    • 事务 trx1 去写盘的时候,带的是组里最后一个事务的 LSN=160,因此等 trx1 返回时,所有 LSN <= 160 的 redo log 都一并完成落盘了。
    • 等到事务 trx2 和 trx3 要去写盘时,就可以直接返回了。

redo log(重做日志)

  • InnoDB 通过 redo log 实现 crash-safe 能力,即使数据库发生异常重启,已提交的事务都不会丢失。

    • 执行写操作语句时,先把变更内容记录到 redo log 中,并更新内存,语句就执行完成了。
    • 在系统比较空闲的时候,或者 redo log 快写满的时候,再将变更内容应用到磁盘数据页上。
  • 内部实现

    • redo log 是固定大小的,从头开始写,写到末尾就又回到开头循环写。一般配置为一组 4 个文件,每个 1GB,文件名是ib_logfile+ 数字
    • write pos 是当前记录的位置,一边写一边后移,写到第 3 号文件末尾后就回到 0 号文件开头。
    • checkpoint 是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录更新到数据文件。
    • write pos 和 checkpoint 之间的是剩余可用空间,用来记录新的操作。
    • 如果 write pos 追上 checkpoint,表示 redo log 已经满了,这时候不能再执行新的写操作,得停下来先擦掉一些记录(应用到磁盘数据页上),把 checkpoint 推进一下。
  • redo log 的写入机制

    • 事务在执行过程中,生成的 redo log 是要先写到 redo log buffer 的。当事务中有多个写操作时,每执行一条语句,就改一次内存数据页,写一次 redo log buffer ,因为此时事务尚未提交 ,不能直接写到 redo log 文件里。最后提交事务时,才真正把日志写到 redo log 文件。
    • 由于 redo log 记录的是数据页的变化,因此线程可以共享 redo log buffer。
    • redo log buffer 里面的内容,可能会在事务还没提交时就先搭便车持久化了,但不是必然每次生成后都直接持久化。
    • redo log buffer 即使搭便车持久化了,也没有 prepare/ commit 状态的概念,只有该事务提交时写入 redo log 文件时才有状态的概念。
    • 日志写到 redo log buffer 是很快的,wirte 到 page cache 也差不多,但是 fsync 持久化到磁盘的速度就慢多了。
  • write 和 fsync 的时机由参数 innodb_flush_log_at_trx_commit 控制

    • innodb_flush_log_at_trx_commit=0 :每次事务提交时都只是把 redo log 留在 redo log buffer 中,由后台线程自动持久化。
    • innodb_flush_log_at_trx_commit=1 :每次事务提交时都将 redo log 直接持久化到磁盘,真正实现 crash-safe,最安全。
    • innodb_flush_log_at_trx_commit=2 :每次事务提交时都只是把 redo log 写入 page cache,而不 fsync 落盘。
  • 后台线程自动持久化 redo log buffer 的场景

    • 后台线程每秒一次的轮询操作:把 redo log buffer 中的日志,调用 write 写到文件系统的 page cache,然后调用 fsync 持久化到磁盘。
    • redo log buffer 占用的空间即将达到innodb_log_buffer_size 一半的时候,后台线程会主动写盘。
    • 并行的事务提交的时候,顺带将这个事务的 redo log buffer 搭便车持久化到磁盘。

binlog(归档日志)

  • 应用场景

    • 主从复制
    • 误删恢复:让数据库恢复到半个月内任意一秒的状态(定期做整库备份 + 保存最近半个月的所有 binlog)
      • 找到最近的一次全量备份,用这个备份恢复出来一个临时库。
      • 从备份的时间点开始,把 binlog 依次重放到误删表之前的那个时刻。
      • 把表数据从临时库取出来,按需要恢复到线上库去。
  • binlog 的写入机制

    • 事务执行过程中,先把日志写到 binlog cache,事务提交的时候,再把 binlog cache 写到 binlog 文件中,并清空 binlog cache。
    • 一个事务的 binlog 不能被拆开,不论这个事务多大,也要确保一次性写入,否则在备库执行时就会被当做多个事务分段自行,破坏了原子性。而一个线程只能同时有一个事务在执行,因此系统给每个线程的 binlog cache 分配了一片内存 ,但是所有线程共用同一份 binlog 文件。
    • 参数binlog_cache_size 用于控制单个线程内 binlog cache 所占内存的大小,超出则需暂存到磁盘。
    • 一个事务的 binlog 日志不会被拆到两个 binlog 文件,即使当前文件写入这条 binlog 之后会超过设置的max_binlog_size值,也会等到这个事务的日志写完再rotate,所以会出现超过配置大小上限的binlog 文件。
  • write 和 fsync 的时机由参数 sync_binlog 控制

    • sync_binlog=0:每次提交事务都只 write 就返回,由操作系统决定何时落盘,风险最大。
    • sync_binlog=1:每次提交事务都会执行 fsync,从而保证 binlog 不会丢失事务,最安全。
    • sync_binlog=N(100~1000) :每次提交事务都只 write 就返回,但累积 N 个(组提交)事务时后台会一起 fsync。在出现 IO 瓶颈的场景里,可以提升性能。风险是,如果主机发生异常重启,会丢失最近 N 个事务的 binlog 日志。
  • binlog 组提交

    • binlog 的 write 和 fsync 的间隔时间短,导致能集合到一起持久化的 binlog 比较少,因此 binlog 的组提交的效果通常不如 redo log 的效果那么好。
    • 想提升 binlog 组提交的效果,可以设置两个参数,从而减少提交一组事务的总时间,因为减少了 fsync 的总次数。但是会增加个别事务响应客户端的时长,并且在高并发时,延迟有可能增加竞争,从而降低吞吐量。通常,设置延迟的好处大于坏处,但应始终进行调优以确定最佳设置。
      • binlog_group_commit_sync_delay:延迟多少微秒后才调用 fsync。
      • binlog_group_commit_sync_no_delay_count:在延迟到期之前,累积到多少次时,就立即调用 fsync。如果延迟指定为 0,则此选项不生效。
    • MySQL 官方文档–binlog 组提交
  • sync_binlog 和 binlog_group_commit_sync_no_delay_count 的区别

    • sync_binlog=N:每个事务 write 后就响应客户端了。落盘是达到 N 次事务时后台 fsync。N 次事务之间主机掉电,数据丢失。
    • binlog_group_commit_sync_no_delay_count=N:当前事务 write 后,必须等凑够 N 个事务一起 fsync 后才能返回,会增加响应客户端的时间。但是一旦响应了,那么数据就一定持久化了。主机掉电时,数据是不会丢失的。
  • 查看 binlog 相关命令

 # 查看 binlog 内容的 2 种方法
 mysql> show binlog events in 'master.000001';
 mysqlbinlog  -vv data/master.000001 --start-position=8900;
 # 查看binlog_format:
 mysql> show session variables like 'binlog_format';
 # 修改日志格式:
 mysql> set session binlog_format=statement;
 mysql> set session binlog_format=row;
 # 查看日志文件列表:
 mysql> show binary logs;
 # 根据查看到的日志文件使用显示日志事件的命令:
 mysql> show binlog events in 'XXX';
  • 双 1 配置日志落盘参数
    • innodb_flush_log_at_trx_commit=1 :每次事务提交时都将 redo log 直接持久化到磁盘,真正实现 crash-safe,最安全。
    • sync_binlog=1:每次提交事务都会执行 fsync,从而保证 binlog 不会丢失事务,最安全。
    • 双 1 配置时,一个事务完整提交前,需要等待两次 fsync 刷盘,一次是 redo log(prepare 状态),一次是 binlog。
    • 而 redo log 在改写为 commit 状态时不需要 fsync 刷盘 ,只要 write 到文件系统的 page cache 即可。
    • 原因一方面是 redo log 本身就有每秒一次的后台轮询刷盘,另一方面是崩溃恢复的逻辑定义为事务只要有 prepare 状态的 redo log + binlog 就视为已提交。
  • 把线上生产库设置成【非双 1】的场景
    • innodb_flush_log_at_trx_commit=2 :每次事务提交时都只是把 redo log 写入 page cache,而不 fsync 落盘。
    • sync_binlog=N(100~1000) :每次提交事务都只 write 就返回,但累积 N 个(组提交)事务时后台会一起 fsync。在出现 IO 瓶颈的场景里,可以提升性能。风险是,如果主机发生异常重启,会丢失最近 N 个事务的 binlog 日志。
    • 业务高峰期。一般如果有预知的高峰期,DBA 会有预案,把主库设置成“非双 1”。
    • 备库延迟,为了让备库尽快赶上主库。
    • 用备份恢复主库的副本,应用 binlog 的过程,与备库延迟的场景类似。
    • 批量导入数据时。

binlog 的三种格式对比

  • statement:binlog 记录的是 SQL 语句的原文

    • statment 格式节省空间和 IO 资源
    • statement 格式 + 某些 unsafe 语句 = 可能导致主备数据不一致
      • 例如 delete + limit 语句:在主库执行时用的是索引 a;而在备库执行时却使用了索引 t_modified。
      • RC 级别需要解决 binlog 日志顺序和语句实际执行顺序不一致的问题,因此只能把 binlog 格式设置为 row。
      • show warnings能看到相应的风险提示。
  • row:binlog 记录的是数据行的内容变化

    • row 格式更耗费空间和 IO 资源(eg: delete 语句删掉 10 万行数据)
    • row 格式记录了真实删除行的主键 id,不存在主备数据不一致问题
    • row 格式 + binlog_row_image FULL = 可以用来恢复数据
      • delete、insert 或者 update 语句导致的数据操作错误,通过把 row 格式 binlog 内容转换一下,就可以恢复到操作之前的状态。MariaDB 的 Flashback工具就是基于此原理来回滚数据的。
      • 使用 binlog 恢复数据的方法
        • 错误方法:mysqlbinlog 解析日志,把里面的 statement 语句直接拷贝出来执行。其风险在于有些语句的执行结果是依赖于上下文命令的。
        • 标准方法:mysqlbinlog 解析日志+ 管道符发给 MySQL 执行 mysqlbinlog master.000001 --start-position=2738 --stop-position=2973 | mysql -h127.0.0.1 -P13000 -u$user -p$pwd;
  • mixed:对 safe 语句记录的是 SQL,对 unsafe 语句记录的是 row

    • MySQL 自己会判断这条 SQL 语句是否可能引起主备不一致,如果有可能(eg: delete + limit),就用 row 格式,否则就用 statement 格式(eg: delete)。
    • 从而既能利用 statment 格式节省空间和 IO 资源的优点(eg: delete 语句删掉 10 万行数据),同时又避免了数据不一致的风险。
    • 因此,线上至少应该把 binlog 的格式设置为 mixed。
    • now()函数会被 MySQL 判断为 statement 格式,因为 binlog 会先记录SET TIMESTAMP=1546103491指定上下文时间,从而是安全的。

WAL 导致了内存脏页

  • 脏页:当内存数据页跟磁盘数据页内容不一致的时候,称这个内存页为“脏页”。
  • 干净页:当内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称这个内存页为“干净页”。
  • MySQL 偶尔很慢就是在刷脏页
    • MySQL 平时执行很快的更新操作,其实就是在写内存和日志(WAL),偶尔很慢一下就是在刷脏页。
    • 把内存脏页刷到磁盘就是数据最终的落盘操作,即落盘是从 buffer pool 更新过来的,而不是从 redo log,因为它并没有记录数据页的完整数据。
    • 在崩溃恢复场景中,InnoDB 如果判断到一个数据页可能丢失了更新,就会将它读到内存,然后让 redo log 更新内存内容。更新完成后,内存页变成脏页,通过刷脏页落盘。
  • 刷脏页的四个场景
    • redo log 满了:这种情况是 InnoDB 要尽量避免的。因为写 redo log 是所有写操作的必经过程,一旦满了,所有的写操作都会阻塞,监控上的更新数会跌为 0。
    • 内存满了,要将淘汰的脏页写到磁盘:这种情况其实是常态,但如果一个查询要淘汰的脏页个数太多,也会导致查询的响应时间明显变长。
    • MySQL 空闲的时候
    • MySQL 正常关闭的时候
  • 如何避免平时刷脏页太慢,导致内存脏页太多,或 redo log 写满
    • 需要合理地设置 innodb_io_capacity 的值,设置成磁盘的IOPS,避免过低(默认值为200,如果SSD建议改为 20000)。
    • 平时要多关注脏页比例,不要让它经常接近 75%。
    • SSD 关闭 innodb_flush_neighbors(MySQL 8.0 默认),机械硬盘可以开启。
  • 高配机器 redo log 文件大小设置过低,会经常写满强刷脏页,导致数据库性能间歇性下降,但是主机磁盘压力很小
    • redo log 设置过低,每过一段时间就会写满,触发强制 flush 刷脏页,导致数据库性能间歇性下降,但是主机磁盘压力很小。正常情况应该是主机磁盘压力大,才导致数据库性能下降。
    • 此时连 change buffer 的优化也失效了。因为redo log 的 checkpoint 一直要往前推,会触发 merge 操作,然后又进一步地触发刷脏页操作。

InnoDB刷脏页的控制策略

  • 控制全力刷脏页的速度上限,即告诉 InnoDB 主机的 IO 能力。参数 innodb_io_capacity,设置成磁盘的IOPS,默认值为200,如果主机磁盘用的是SSD,建议改为 20000。

    • 如果遇到 MySQL 的写入速度很慢,TPS 很低,但是数据库主机的 IO 压力并不大的问题,可以排查此参数是否过低。
    • mysql> show global variables like 'innodb_io_capacity';
    • 磁盘的 IOPS 可以通过 fio 命令测试磁盘随机读写能力获得
    • fio -filename=$filename -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=16k -size=500M -numjobs=10 -runtime=10 -group_reporting -name=mytest
  • 控制按全力速度的百分之几来刷脏页。为了避免平时刷太慢,导致内存脏页太多,或 redo log 写满,InnoDB 就根据这两个因素决定平时刷脏页速度百分比。R % = max{ func1(当前脏页比例)、func2(redo log 写盘的速度) }。参数 innodb_max_dirty_pages_pct 控制脏页比例上限,默认值是 75%。平时要多关注脏页比例,不要让它经常接近 75%。

    • 查看当前脏页比例
    • mysql> select VARIABLE_VALUE into @a from global_status where VARIABLE_NAME = 'Innodb_buffer_pool_pages_dirty';
    • mysql> select VARIABLE_VALUE into @b from global_status where VARIABLE_NAME = 'Innodb_buffer_pool_pages_total';
    • mysql> select @a/@b;
  • 刷新相邻页面策略:连坐刷邻居可以减少很多随机 IO,对机械硬盘(几百 IOPS )能大幅提升性能,对 SSD 建议关闭(MySQL 8.0 中默认是 0)。因为 IOPS 往往不是瓶颈,而“只刷自己”,就能更快地执行完必要的刷脏页操作,减少 SQL 语句响应时间。

    • innodb_flush_neighbors=1 连坐机制
    • innodb_flush_neighbors=0 不找邻居,自己刷自己

slow log(慢查询日志)

  • 如何定位慢sql
    • 慢sql排名分析,排名靠前的sql并不一定是真正需要优化的。
    • 慢查询日志里面关注“变更以后新出现的”慢查询。
    • 一般先关注总扫描行数最多的语句。
    • 从show processlist看线索。
  • 查看慢查询日志文件位置
    sql Show variables like "output";
  • 扫描行数 Rows_examined
    Rows_examined:表示语句执行过程中扫描了多少行
    set long_query_time=0,将慢查询日志的时间阈值设置为 0,能把所有语句记录到 slow log 里。

general log(全量查询日志)

  • general log 是关于 mysqld 正在做什么的通用记录。当客户端连接或断开连接时,服务器将信息写入日志,并记录从客户端接收的每个 SQL 语句。当您怀疑客户机中出现错误并希望准确地知道客户机向 mysqld 发送了什么内容时,general log 非常有用。
  • mysql 官方文档—general log
  • 其他参考文档
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL学习总结--WAL日志 的相关文章

  • 在 MySQL 中对整数字段运行带引号的数字(字符串)查询时会发生哪些复杂情况

    在 SQL 中 不应引用整数 因为如果引用 它将是一个字符串 但我很好奇如果我这样做会出现什么问题 并发症 例如 SELECT FROM table WHERE id 1 正确的 vs SELECT FROM table WHERE id
  • 合并两个 MYSQL SELECT 查询[重复]

    这个问题在这里已经有答案了 可能的重复 如何将两个 Post Category 表 MYSQL SELECT 查询合并为一个 https stackoverflow com questions 12972130 how to combine
  • MySQL“LIKE”搜索不起作用

    我通过 LOAD DATA INFILE 在 MySQL 中导入了一个 txt 数据库 一切似乎都正常 唯一的问题是 如果我使用以下查询在数据库上搜索记录 SELECT FROM hobby WHERE name LIKE Beading
  • Google Cloud SQL 在重新启动时卡住

    我的云 sql 实例长时间处于重新启动状态 在操作窗格中 重新启动的状态显示为待处理 并且还发生了导出 其状态仍为Running 有没有办法可以强制重新启动或取消重新启动或从常规备份中恢复数据 不 没有办法 如果您向 Google 支付高级
  • mysql转储到derby

    我正在使用 derby 在 eclipse 中进行开发 是否可以从 MySQL 转储表并以某种方式将其用于 derby 我知道 ddl 和 dml 对于两个 dbms 来说是不同的 但我正在寻找一种除了转储 导出之外的合适方法 我可以找到两
  • 使用Perl/DBI/MySQL/InnoDB查找外键信息

    我想以编程方式查找 MySQL 数据库中特定 InnoDB 表的外键 我正在使用 Perl 我偶然发现 dbh gt foreign key info 我刚刚尝试使用它 但似乎有点错误 它不会返回 ON DELETE 和 ON UPDATE
  • ORDER BY 字段内的 MySQL 子查询。 (没有内连接)

    有很多与此相关的问题 但都具有使用内部联接的相同答案 这 我认为 在这里是不可能的 如果我错了请告诉我 我现在正在做的是调用两个不同的 mysql 查询来获取结果 它工作完美 db gt query SELECT FROM meta WHE
  • 在 SQL 中,如何从 SELECT * FROM ... 中排除结果?

    我知道我的标题不太具有描述性 让我在这里详细解释一下 假设一个表有 26 个字段 例如字段 a 字段 z 我只想要一个选择查询只返回 15 个字段 所以 通常 我会执行 SELECT field a field b field o FROM
  • MaxListenersExceededWarning:检测到可能的 EventEmitter 内存泄漏。添加了 11 条消息列表。使用emitter.setMaxListeners()来增加限制

    我知道这可能会标记为重复的解决方案 但堆栈溢出的解决方案对我不起作用 Problem node 5716 MaxListenersExceededWarning Possible EventEmitter memory leak detec
  • posts_search 中的自定义查询

    如何使用此查询作为我的自定义搜索查询 add filter posts search my search is perfect 20 2 function my search is perfect search wp query sWord
  • mysql自动存储记录创建时间戳

    mysql 有什么方法可以在创建记录时自动将时间戳存储在记录行中 我试图使用时间戳 数据类型 和 current timestamp 作为默认值 但后来意识到每次更新记录时都会更新 我只需要一些可以存储创建时间戳的东西 Thanks Set
  • 在 android 中建立与 MySQL 的池连接

    我需要从我的 Android 应用程序访问 MySQL 数据库 现在所有的工作都通过 DriverManager getConnection url 等等 但我必须从多个线程访问数据库 所以我必须使用连接池 问题1 是 com mysql
  • 快速将列的副本添加到 MySQL 表

    我需要一种快速的方法来复制表中的 DATETIME 列并为其指定一个新名称 我的表中有一个名为 myDate 的列 名为 myResults 我需要一个查询来在名为 newDate 的表中创建一个新列 该列的数据与 myDate 列完全相同
  • SQL:在行中保留计数或从数据库中选择计数

    示例 我有 2 张桌子 类别 Posts 在这样的类别中保留帖子编号是一个好方法吗 类别 id title posts 1 golf 50 2 soccer 90 posts id title category id 1 news 1 1
  • 如何在 MySQL 查询本身中检索 JSON 数组中存储的值?

    我有下表 product id product name image path misc 1 flex http firstpl course level id 19 group id 40067 2 Android http firstp
  • 将 NULL 变量插入数据库

    我将变量设置为 NULL 我试图将其插入数据库 但由于某种原因 它们一直以 0 的形式提交 我确信我试图插入的列允许 NULL 并且默认值设置为 NULL 这是我的代码 insert NULL query mysql query INSER
  • Tomcat JDBC 池中没有足够的空闲连接

    给定以下 Tomcat JDBC 连接设置
  • 在查询中创建临时变量

    我希望能够在查询中创建一个临时变量 而不是存储过程或函数 它不需要声明和设置 这样我在调用它时就不需要传递查询参数 正在努力朝这个方向努力 Select field1 tempvariable 2 2 newlycreatedfield t
  • Mysql:将数据库从本地时间转换为UTC

    我需要从本地时间 ut UTC 转换现有的 日期时间字段 数据库 这些值和日期时间存储在时区为 CET 1 夏令时 2 的服务器上 选择我使用的数据时UNIX TIMESTAMP 它神奇地补偿了一切 即时区偏移和夏令时 如果我正确阅读了文档
  • cmd 和 workbench mysql 查询性能差异

    我有两个问题 正如我的标题 哪一个对于对大量数据运行大型查询更有效 我查看了 MySQL 文档 其中解释了工作台的性能https www mysql com products workbench performance https www

随机推荐

  • gcc make编译android,是用cmake编译openssl(支持android)

    openssl 首先openssl的源码 方案 这里用到了janbar的方案 且作者一直在更新 基本直接可以编译 设置到的主要的cmake文件 CMakeLists txt c rehash cmake crypto CMakeLists
  • Excel获取数值

    Excel获取数值篇 修复Cell getCellType方法过时问题 使用最新的类型方式获取 根据Excel单元格类型返回相对应的值 根据Excel单元格类型返回相对应的值 param cell return public static
  • NLP七十年!斯坦福教授Manning长文梳理

    作者 LRS 来源 新智元 从手工规则 神经网络到Transformer基础模型 自然语言处理的未来是统一多模态 走向通用人工智能 过去十年间 仅靠简单的神经网络计算 以及大规模的训练数据支持 自然语言处理领域取得了相当大的突破 由此训练得
  • vmware14 安装windows 11 注意事项

    1 正常创建虚拟机 系统选择window 10 x64 2 修改启动方式为UEFI 虚拟机设置 选项 高级 3 修改虚拟机配置 启用加密 虚拟机设置 选项 访问控制 启用加密 4 接下来正常安装即可 系统从微软官网下载
  • JedisPool链接未释放

    最近线上出现一个问题 一个接口一段时间后无响应 查看nginx日志499 502异常 zpp trade recharftenunt v1 qury HTTP 1 1 499 zpp trade recharftenunt v1 qury
  • 猫眼家APP广告变现:数据埋点在广告变现中的重要作用

    前言 数据埋点技术是一种收集用户行为数据并生成大量数据的方法 当用户在应用程序中执行操作时 代码会捕获并记录该操作 从而实现数据埋点 数据埋点对于实施APP广告变现策略至关重要 开发人员需要准确了解用户的行为习惯 兴趣和偏好 以提高广告变现
  • 基于Qt4+SQLite3的通信录

    首先申明 本文借鉴于 http blog csdn net jianchi88 article details 7052270 通信录实现的动能有 添加 查找 删除 但在页面效果上还不太美观 功能上没有去验证输入的信息的有效性 运行环境 u
  • 【FPGA零基础学习之旅#8】阻塞赋值与非阻塞赋值讲解

    欢迎来到FPGA专栏 阻塞赋值与非阻塞赋值 o o 嗨 我是小夏与酒 博客主页 小夏与酒的博客 该系列文章专栏 FPGA学习之旅 文章作者技术和水平有限 如果文中出现错误 希望大家能指正 欢迎大家关注 目录 阻塞赋值与非阻塞赋值 一 基础知
  • OceanBase 3.1.2版本测试报告

    测试场景 OLTP场景 测试工具使用的是开源版本BenchmarkSQL5 0 说明 我们已经通过修改源代码 实现了MySQL的支持 在单位进行分布式数据库POC选型时 都是使用该版本 集群拓扑及硬件配置信息 7台物理机 使用OBD直接部署
  • MySQL 中not in 查询为空

    MySQL not in踩坑 今天想用not in进行嵌套查询时 从逻辑上本应返回数据的结果却没有返回任何数据 查阅资料后找到原因 not in中 不能包含null值 如果包含null值 则直接返回空结果集 上代码
  • 计算二进制位"1"的个数

    写一个函数 返回数字中二进制位为 1 的个数 比如36 化为二进制得到100100 其中有2个 1 方法1 分别判断各个位 int bit count unsigned int n int count for count 0 n n gt
  • 最优服务次序问题(贪心法)

    最优服务次序问题 贪心法 问题描述 设有n个顾客同时等待一项服务 顾客i所需要的服务时间为ti 应如何安排顾客的服务次序 才能使平均等待时间最短 平均等待时间是n个顾客等待服务时间的总和除以n 解题思路 1 算法主要思想 本题我们直接采用贪
  • 【小白学习日记】如何使用matlab实现多矩阵排列组合

    matlab实现穷举法 今天在写程序时 需要实现一个穷举 即现有一个1 8的矩阵 第一个元素有四个值 第二到七个元素分别从0 1 1里面取值 要列出所有情况 即有8748种情况 在论坛上遇到一位提出利用ndgrid函数即可解决上述问题 原文
  • python关于字符串下面说法错误的是_Python计算机等级考试中易出错概念问题6(附答案),稳基,修炼,之,易错,含答案...

    1 关于Python对文件的处理 以下选项中描述错误的是 A Python能够以文本和二进制两种方式处理文件 B Python通过解释器内置的open 函数打开一个文件 C 当文件以文本方式打开时 读写按照字节流方式 D 文件使用结束后要用
  • Spring Boot静态资源访问和配置全解析

    一 默认静态资源映射规则 二 自定义静态资源映射规则 2 1 自定义静态资源映射类 2 2 在application properties中进行配置 2 2 1 配置静态资源访问路径 2 2 2 配置静态资源目录 原文 在web开发中 静态
  • 笔试真题之判断一个数字是否是素数(算法详解及python实现)

    题 explain 判断一个数字是否是素数 input 数字n output 如果是素数返回True 否则返回False 示例 判断112272535095293是否是素数 算法思想 首先判断是不是1或2 1不是素数 2是素数 其次判断是不
  • ts文件运行环境搭建和运行步骤

    1 全局安装 TypeScript 语言的编译器 window r gt cmd gt 命令提示行 下输入npm i g typescript 只需首次安装即可 2 在vscode的终端里先运行tsc init tsc是ts语言的编译器 如
  • C++初步

    定义一个命名空间Myspace 包含以下函数 将一个字符串中的所有单词进行反转 并输出反转后的结果 例如 输入字符串为 Hello World 输出结果为 olleH dlroW 并在主函数内测试该函数 include
  • node-sass安装失败番外篇

    node sass安装失败番外篇 工作 环境 错误现象 原因 总结 工作 环境 win10 npm 使用淘宝镜像源 错误现象 报错信息如下 我在不同电脑的不同 编辑器 webstom vscdoe cmd git bash 下显示的错误不太
  • MySQL学习总结--WAL日志

    MySQL学习总结 WAL日志 WAL redo log VS binlog 日志的两阶段提交 组提交机制 group commit redo log 重做日志 binlog 归档日志 binlog 的三种格式对比 WAL 导致了内存脏页