借鉴 Oracle,深入修改 MySQL/PostgreSQL 内核代码(课程专业答疑)

2020-07-30 00:00:00 函数 内存 插入 调试 竞争

本次文章主要是解决同学们在7月19号直播课程后的问题汇总,快来看看有没有你遇到的问题?

问题1:

一个关于MYSQL安装问题, 编译时选择字符集为UTF8, 而初始数据库时选择的是UTF8MB4,配置文件也设置了UTF8MB4.下次登陆的时报错 COLLATION 'utf8mb4_0900_ai_ci' is not valid for CHARACTER SET 'utf8'. 我想重新初始化数据库,是不是删除data目录就可以?

回答1:

是的,删除 data中的所有文件。或者,修改配置文件,另换一个Data目录也行。



问题2:

1、库文件是怎么关联的,是知道这个库文件里面有memcopy么?

2、偏移88字节怎么来的

3、没怎么接触过开发。问个小白问题,共享内存更改要锁,那那些全局变量呢,那么多进程线程一起改?

回答2:

1、库文件是怎么关联的,是知道这个库文件里面有memcopy么?
使用systemtap或DTrace,打开进程的所有探针,显示完成某操作时所有的函数调用。在跟踪Oracle这样没有源码的程序时,观察memcpy的内存流,是了解Oracle内部原理十分重要的手段。
2、偏移88字节怎么来的
使用gdb这样的调试工具,停在目标函数处,使用“x/4x 内存地址”这样的命令,显示内存中的数据,找到目标数据,算一下目标数据和初始内存地址的差。
3、没怎么接触过开发。问个小白问题,共享内存更改要锁,那那些全局变量呢,那么多进程线程一起改?
要先获得锁,才能访问或修改。访问所有的共享资源(包括共享的内存、全局变量),都需要有锁保护。除非这个共享资源从来不会被修改。当然,还可以使用我们第二次课程MySQL Redo体系中的Lock Free模式。



问题3:

1、还是想请老师比较下 mysql的插入和pg或者oracle的插入性能,mysql在jdbc插入时速度也差oracle很远,少一个数量级吧。我用ali datax 实验时,发现从oracle向oracle中插入非常慢,而从mysql向oracle中插入就很快。因为我们有个场景是并发读取比较大,同时表上还有update,insert 操作 这比并发读要小一个量级,以前在oracle上面,现在要迁移到postgres或者mysql上
2、今天上午ppt和doc,还有练习脚本能放qq上吗?

回答3:

我先从它们的理论上说一下插入的性能吧,等你有时间后,我可以指导你,我们一起用systemtap脚本,实际的去量化pg/mysql/oracle插入时各阶段时间的异同。
从理论上说,PG和Oracle的插入性能,一定是高于MySQL的。特别是并发插入。PG没有UNDO,插入操作不需要把行设为过期,插入就只是插入。MySQL/Oracle插入就算产生的UNDO很少,但还是需要分配UNDO空间、操作UNDO页。理论上PG插入的工作量比Oracle还少,可以做的比Oracle更快,但实际上由于事务实现方面不如Oracle,PG插入性能并不能比Oracle更快。但比MySQL快是可以的。另外,MySQL Innodb是索引组织表,这种表在插入的时候需要排序,这又增加了工作量,而且,如果是主键值单调顺序增长的环境(比如主键列值为1、2、3、4……这样顺序增长),在并发插入的情况下,又会造成索引页的竞争。
Ali DataX不太了解,从Oracle向Oracle迁移慢,可能是他们软件设计的问题。像这种不明原因慢的问题,在Oracle中可以使用Oracle的等待事件体系找出慢的原因,对于MySQL、PG,可以使用systemtap脚本,发现时间都消耗在哪里了。



问题4:

吕老师的centos具体是哪个版本来着?

回答4:

我的版本信息:
[root@pg01 tbase]# uname -a
Linux pg01 3.10.0-1062.9.1.el7.x86_64 #1 SMP Fri Dec 6 15:49:49 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
[root@pg01 tbase]#
[root@pg01 tbase]# cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)


问题5:

1.应该以什么规则设置断点?按行设置还是进入函数时设置?

2.gdb显示函数执行路径上打开多个.c,怎么判断执行顺序?

3.怎么查看一个全局变量是在哪个源文件中定义的?

回答5:

1、这个不一定,比如观察MySQL的逻辑读,可以在buf_page_get_gen函数入口处设置断点,也可以在它之下某一行上设置断点。这个看需求了。
2、你说的是用bt命令显示调用堆栈吗?这个上面的,是后被调用的函数。下面的,是开始的调用者。
3、在VIM中使用sceop搜索::cs find g 变量名。还可以使用find命令:find 目录 -name "*.h" | xargs grep -n 变量名


问题6:

我有一个业务系统11.2.0.4,在Linux5上没有问题,升到Linux 6后不定时出现library cache: mutex X 竞争,后来设vm.extra_free_kbytes后解决了,这个能用调试的方法来确认是否是内存的问题吗?平时负载cpu百分之十左右,发生library cache: mutex X 瞬间达到百分之八十以上,每次持续30秒到1分钟之间,后面自动恢复,基本每周发生一次,每次发生时间不固定。

回答6:

这个问题考验的是综合素质。首先要明白Library cache mutex X竞争出现在那些情况下。这是发掘这个问题的源头。这一点,可以使用调试技术,去理解Library cache mutex X竞争。我当年就是用调试方式,去发掘Oracle Mutex竞争都是什么意义的。Library cache mutex X竞争通常出现在硬解析时,硬解析时涉及大量内存块的分配、回收,但这都是在共享池中,并不涉及操作系统的cache和free memory。但是,硬解析时还会有大量的涉及PGA的操作,要在PGA中存储好多信息,而PGA内存的分配,就是从操作系统Free Memory中来的了。硬解析时的Mutex和PGA的内存分配有时是包含的,PGA内存分配竞争,就会造成硬解析Mutex竞争。这是在数据库内要掌握的东西。在操作系统层,要对slab内存分配机制有简单了解、对内核参数的意义有基础的认识。使用systamtap的内核调试功能,可以加深对这些东西的了解。

相关文章