绑定完请刷新页面
取消
刷新

分享好友

×
取消 复制
借鉴 Oracle,深入修改 MySQL/PostgreSQL 内核代码(课程专业答疑)
2020-07-30 14:36:23

本次文章主要是解决同学们在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的内核调试功能,可以加深对这些东西的了解。

分享好友

分享这个小栈给你的朋友们,一起进步吧。

调试数据库 ---- 源码研究方法论
创建时间:2020-06-16 17:28:11
最能让你坚持下去的源码学习方法 ---- 调试数据库。Oracle的各种DUMP、Trace和Event,增加了研究这个数据库的“乐趣”,使用Oracle成为一个可研究的数据库。开源数据库当然也可以通过钻研源码的方式去研究,但这样的学习周期太长。本课程教你用调试技术不断为MySQL/PostgreSQL扩展功能,在学习源码的同时,不断开发自己的、类似Oracle DUMP、Trace、Event的小工具,这就是我所说的“正向反馈”。用正向反馈,激励自己坚持下去,最终成功。
展开
订阅须知

• 所有用户可根据关注领域订阅专区或所有专区

• 付费订阅:虚拟交易,一经交易不退款;若特殊情况,可3日内客服咨询

• 专区发布评论属默认订阅所评论专区(除付费小栈外)

栈主、嘉宾

查看更多
  • vage
    栈主

小栈成员

查看更多
  • 叶子,你好
  • 小雨滴
  • 潘佳伟
  • 东风快递
戳我,来吐槽~