- 可以自定义本地文件名
- 可以在启动时自主选择是否需要加载到内存中
- 支持在接受用户请求前先加载一部分,剩下的可以放到后台进程中继续加载
不过,作者目前只是想到了以下几点特性,虽然有的还没有实现:
- 采用多线程来加载,这对于使用RAID阵列更有优势
- 支持在线保存/还原缓冲池,而无需重启mysqld
- 增加缓冲池的统计信息,便于在加载时能选择哪些优先级别比较高,避免所有的页都以同一优先级加载
下面我们来尝试用以下这个补丁,看看效果如何。
1、准备
[yejr@localhost yejr]# cd innodb_plugin-1.0.1
[yejr@localhost yejr]# patch -p1 < ../buffer_pool_save_restore.patch
patching file handler/ha_innodb.cc
Hunk #1 succeeded at 1986 with fuzz 2 (offset 67 lines).
patching file include/srv0start.h
patching file srv/srv0start.c
Hunk #1 succeeded at 1950 (offset 18 lines).
[yejr@localhost yejr]# cd ..; alias cp=cp; cp -rf innodb_plugin-1.0.1/* mysql-5.1.26-rc/storage/innobase/
[yejr@localhost yejr]# cd mysql-5.1.26-rc
[yejr@localhost yejr]# ./configure '-without-embedded-server' '-with-innodb' '-with-zlib-dir=bundled' '-with-big-tables' '-enable-assembler' '-enable-local-infile' '-with-pic' '-prefix=/usr/local/mysql' '-with-extra-charsets=complex' '-enable-thread-safe-client' && make && make install-strip
[yejr@localhost yejr]# strings /usr/local/mysql/libexec/mysqld | grep ib_buf_pool_state
可以看到,已经将该补丁编译进去了。在这里,也可以下载
percona 提供的源码,里面已经集成了其他的几个补丁。
2、测试
首先,模拟各种方法,将innodb buffer pool尽量填满,最快的办法就是导出全部数据。设置 innodb_buffer_pool_size 大小为 14G,然后导出全部数据,可以看到全部被填满了:
...
Buffer pool size 917503
Free buffers 0
Database pages 917503
Modified db pages 0
...
关闭mysqld,查看一下是不是产生了本地文件。
[yejr@localhost yejr]# mysqladmin shut
[yejr@localhost yejr]# ls -lh ib_buf_pool_state
-rw-rw---- 1 mysql mysql 19M Oct 8 14:34 ib_buf_pool_state
[yejr@localhost yejr]# file ib_buf_pool_state
ib_buf_pool_state: ASCII text
[yejr@localhost yejr]# head -2 ib_buf_pool_state
43 1344258 0 69 0 122
43 1344259 0 69 0 122
[yejr@localhost yejr]# wc ib_buf_pool_state
917439 5504634 19545127 ib_buf_pool_state
然后启动mysqld,可以看到日志中记录了大量类似下面的内容:
....
081008 14:36:28 mysqld_safe Starting mysqld daemon with databases from /data/mysql
081008 14:36:30 InnoDB: highest supported file format is Barracuda.
081008 14:36:35 InnoDB Plugin 1.0.1 started; log sequence number 205351853106
succeeded for space=43 offset=1344258 table_id=0 69 index_id=0 122
succeeded for space=43 offset=1344259 table_id=0 69 index_id=0 122
.....
然后,再看看buffer pool的情况:
...
Buffer pool size 917503
Free buffers 0
Database pages 917503
Modified db pages 0
...
可以看到,几乎填满了所有buffer pool,相当于还原到了重启前的内存状态,省去了需要经过一段时间运行才能使内存填满所需缓冲的过程,实在是方便。不过,它也有一个致命的缺点,那就是如果你的buffer pool较大(测试时最高用到14G),则启动可能会非常慢,有时候甚至无法忍受。我的测试服务器配置应该说还算不错了(dell 2950, 16Gb ram, MD3000盘阵),然而上面的测试中,启动mysqld居然花了几乎7个小时才完成,根本无法忍受。
把buffer pool大小调成6G,还是执行上面的测试,发现启动时间立刻缩小了很多,只需要
2min53s。
注意:不建议在非常重要的系统中使用该补丁,万一出了问题,没人为你负责 :)
附:下面是我的一些测试数据
417439 3m0.737s
617439 4m50.357s
637439 5m38.622s
667439 6m8.553s
717439 7m10.761s
727439 7m14.659s
827439 6h20m
第一列是表示 ib_buf_pool_state 文件中有多少行数据。另外,可以通过 head/tail/grep 等工具来自主选择需要被重新加载的buffer内容。
本文出自 “老叶茶馆” 博客,转载请与作者联系!
转载于:https://my.oschina.net/yejr/blog/878596
分享到:
相关推荐
8. **调整Buffer Pool大小**:根据数据库的工作负载,管理员可以通过调整Buffer Pool的大小来平衡内存使用和I/O性能。更大的Buffer Pool可以减少磁盘I/O,但会占用更多内存。 9. **监控与调优**:通过监控Buffer ...
当Buffer Pool执行完增删改操作后,这些改动会被记录在redo log中,通常分为两部分:Innodb_log_buffer(内存中的重做日志缓冲区)和redo log file(磁盘上的重做日志文件)。Innodb_log_buffer存储最近的更改,当其...
5. 缓冲池(Buffer Pool) InnoDB的缓冲池用于缓存数据页和索引页,减少磁盘I/O。调整缓冲池大小和配置,如预读(Prefetching)策略,可以显著提升性能。 6. 事务日志与崩溃恢复 InnoDB使用重做日志(Redo Log)...
浅析在线调整 innodb_buffer_pool_size 作者:zhou ...16KB的大小设定),而buffer_pool是用来管理和缓存这些page的,innodb会把一块连续的内存划分给buffer_pool使用,并把buffer_pool等分为多个buffer
MySQL 性能优化 InnoDB buffer pool flush 策略 MySQL 中 InnoDB 存储引擎使用 buffer pool 来缓存从磁盘读取到内存的数据页。Buffer pool 通常由数个内存块加上一组控制结构体对象组成。内存块的个数取决于 buffer...
Buffer Pool是数据库管理系统中的一个重要组件,特别是在InnoDB存储引擎的MySQL中,它是内存中的一个关键数据结构,用于提高磁盘I/O效率。Buffer Pool的主要作用是缓存数据页和索引页,使得数据库操作能在内存中快速...
- 数据库参数调优:例如innodb_buffer_pool_size、innodb_log_file_size等,需根据实际情况进行调整。 - 分区和分表:对于大型表,可以使用分区或分片技术来分散负载和提高查询性能。 - 主从复制:通过设置读写分离...
MySQL中的Buffer Pool是InnoDB存储引擎中一个非常核心的内存数据结构,它的主要作用是为了提高数据库的性能。Buffer Pool能够缓存数据页和索引页,减少数据库对于磁盘的访问次数,以此提升读写效率。具体而言,...
`innodb_buffer_pool_size` - **描述**:设置InnoDB用于高速缓存数据和索引的内存大小。 - **应用场景**:根据服务器可用内存大小调整,一般建议设置为物理内存的80%,以减少磁盘I/O操作。 ##### 12. `innodb_...
什么是BufferPool? **Buffer Pool基本概念** Buffer Pool:缓冲池,简称BP。其作用是用来缓存表数据与索引数据,减少磁盘IO操作,提升效率。 Buffer Pool由**缓存数据页(Page)** 和 对缓存数据页进行描述的**...
总之,了解flush链表在Buffer Pool中的作用,有助于我们更好地理解和优化数据库系统的性能,特别是在处理大量并发事务和大数据量时。通过合理地管理flush链表,我们可以确保数据库的稳定性和高效率。
1. `innodb_buffer_pool_size` 设置为 48GB,用于缓存数据和索引页。 2. `innodb_buffer_pool_instances` 设为 8,提高缓冲池管理的效率。 3. `innodb_flush_method` 设为 O_DIRECT,减少操作系统缓存带来的影响。 4...
Buffer Pool主要用于存储数据库的缓存数据页,包括表的数据、索引和其他数据库对象,以减少磁盘I/O操作。在生产环境中,根据机器配置合理设置Buffer Pool对于优化数据库性能至关重要。以下我们将深入探讨如何基于...
在数据库管理领域,Buffer Pool是数据库系统中一个至关重要的组件,它用于缓存数据和索引页,以减少对磁盘的I/O操作,从而提高性能。本篇将深入探讨如何通过Chunk机制来实现数据库运行期间Buffer Pool的动态调整,...
通过配置innodb_buffer_pool_size和innodb_buffer_pool_instances参数,可以将一个大的缓冲池分配为多个实例,每个实例拥有独立的free、flush、lru等链表。这样的设计允许不同的线程并发地访问不同的缓冲池实例,...
在 MySQL 启动时,会根据配置参数 `innodb_buffer_pool_size` 申请一定大小的内存,用于创建 buffer pool。这个参数决定了 MySQL 可以缓存多少数据页,通常设置为可用物理内存的70%-80%以平衡数据库性能与操作系统...
#### 三、InnoDB引擎BufferPool缓存机制 ##### 1. Buffer Pool的作用 Buffer Pool是InnoDB的一个内存区域,用于缓存表和索引的数据。它可以极大地提高数据访问速度,减少磁盘I/O操作。 - **数据缓存**: Buffer ...
- Buffer Pool(缓冲池):它是InnoDB中最重要的组成部分,主要用于缓存数据和索引在内存中,以减少对物理磁盘的I/O操作,显著提高数据库性能。 - LRU(最近最少使用)算法:InnoDB通过LRU算法管理缓冲池中的页,以...
loose-innodb-buffer-pool-stats=0 ``` 对于MySQL 5.6,除了上述字段,还需要加上: ``` default-tmp-storage-engine=MyISAM loose-innodb-metrics=0 loose-innodb-ft-default-stopword=0 loose-innodb-ft-...