MySQL 编译安装并且开启DEBUG模式

因为想分析下mysql中一些操作的内部执行过程,单纯的看源码太枯燥了,所以决定结合mysql的执行过程来分析,mysql作为一款成熟的数据库软件,在设计的时候就考虑到了调试的问题,只是想开启调试模式的话,要编译源代码不能直接用rpm的安装方式,我是编译安装的5.7.16的版本,这里记录一下安装过程,以后再用就不用四处查资料了。

这里记录的只是最简单的编译安装模式,只是开启了DEBUG模式。首先编译过程中会产生大于3.6G左右临时文件,时间大约花费30分钟左右。

编译或者安装过程中如果出现任何错误,推荐删除缓存文件,从头再来,笔者抱着侥幸的心试过,后期登录数据库的时候出现了段错误,深层原因是线程违规访问了数据,最根本原因是缺失依赖导致没走mysql的设置文件,走了默认设置,出现了类似不兼容的问题。

1.首先检查必须的依赖软件冲突:

检查mariadb,这个如果不卸载,安装完毕之后启动服务会出错。

[root@ ~]# rpm -qa|grep mariadb
mariadb-libs-5.5.-.el7_0.x86_64
[root@ ~]# rpm -e mariadb-libs-5.5.-.el7_0.x86_64 --nodeps

检查是否安装了必须的依赖,如果缺失,在cmake的时候会出现各种错误,gcc、gcc-c++、bison-devel、ncurses-devel。

2.首先下载源码包:wget http://cdn.mysql.com/Downloads/MySQL-5.7/mysql-5.7.16.tar.gz 。如果是服务器下载,最好是采用cdn的,速度能达到180+M/S,如果是个人电脑下载,可能mysql默认的是dev的网址,只要版本没错,应该就没问题。

3.解压:tar xvf mysql-5.7.16.tar.gz。

4.进入解压的文件夹,执行cmake,执行的时候要带编译参数,带参数的目的一部分是开启调试模式,一部是因为mysql在编译的时候回自动检查部分依赖,如果没有可以设置自动下载。

cmake \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/mysql/data \
-DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DEXTRA_CHARSETS=all \
-DENABLED_LOCAL_INFILE= \
-DDOWNLOAD_BOOST= \
-DWITH_BOOST=/usr/local/boost \
-DWITH_DEBUG= \
-DCURSES_LIBRARY=/usr/lib/libncurses.so \
-DCURSES_INCLUDE_PATH=/usr/include

其中DDOWNLOAD_BOOST、DWITH_BOOST代表如果boost不存在是否自动下载,如果不设置并且本地没有,编译会失败,DWITH_DEBUG=1表示开启调试模式。如果编译过程中出现缺失libncurses.so,仍旧是依赖没有安装完整,如果本机有,可以手动制定位置,如果没有就安装。

5.make:很多人喜欢make && make install,这里最好分开使用,那个地方出了错,容易分辨。

6.make install:安装,安装完毕之后注意最后几行记录,它表示生成的mysql.server在什么位置,我的是在/usr/local/mysql/support-files文件夹下。mysql文件在/usr/local/mysql/bin文件夹下。

7.生成配置文件、生成权限。生成各种文件夹。

在/usr/local/mysql/support-files路径下有mysql自带的默认配置文件,将这个文件拷贝到/etc目录下并重命名为my.cnf,mysql启动的时候会首先在这个目录下找配置文件,默认的配置文件内容太少了,而且没指定错误文件的位置,这里修改一下,我的配置是:

# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/5.7/en/server-configuration-defaults.html
# *** DO NOT EDIT THIS FILE. It's a template which will be copied to the
# *** default location during install, and will be replaced if you
# *** upgrade to a newer version of MySQL. [mysqld] # Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at % of total RAM for dedicated server, else %.
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock # Disabling symbolic-links is recommended to prevent assorted security risks
# symbolic-links=
#
# innodb_buffer_pool_size = 128M
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin # These are commonly set, remove the # and set as required.
# basedir = .....
# datadir = .....
# port = .....
# server_id = .....
# socket = ..... # Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

这里我手动指定了,数据文件,sock文件,pid文件和错误文件的路径,这些路径明确了,接下来就好新建文件夹并赋予权限了。

按照设置里面新建好对应的路径文件:/var/lib/mysql;/var/log/;/var/run/mysqld/,并且给这些路径都赋予mysql权限,如果不权限不足,后期mysql服务或者mysql登录会有异常。

chown -R mysql.mysql /var/run/mysqld/
chown -R mysql.mysql /tmp
chown -R mysql.mysql /var/lib/mysq
chown -R mysql.mysql /var/log

因为前面编译的时候指定了一个参数是:DMYSQL_UNIX_ADDR=/tmp/mysql.sock,这个如果不处理,连接mysql的时候会出现错误,其实错误的原因也是权限问题,我试着修改这个路径的权限,但是没解决问题,最后的方法是新建了快捷方式:ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock。

8.到这里基本的工作就做完了,接下来是生成第一次登陆的密码,找到mysqld,使用mysqld --initialize命令来生成密码,这个生成的密码会打印到屏幕上,应该是在输出的最后几行,把这个密码复制下来,备用。

9.所有工作完成之后,启动系统,如果想开调试模式,启动的时候要加参数:/usr/local/mysql/support-files/mysql.server start --debug --console &,如果不出错误,myslq就已调试的模式启动了。调试文件在:/tmp/mysqld.trace中,注意:这个文件大小增长很快,如果不是硬盘很大,不建议mysql在调试模式下长期运行。

安装过程中一定要仔细注意分析错误信息,只要能找准问题所在,解决方案google上都有,mysql在启动或者登录过程中出了错误,mysql的错误日志中也有详细记录,有问题先看日志。

安装过程中参考了很多人的文章,不能一一列举,感谢大家的帮助,谢谢!

上一篇:mysql普通查询日志


下一篇:python pycharm2018开启debug模式