MySQL 编译安装并且开启DEBUG模式
因为想分析下mysql中一些操作的内部执行过程,单纯的看源码太枯燥了,所以决定结合mysql的执行过程来分析,mysql作为一款成熟的数据库软件,在设计的时候就考虑到了调试的问题,只是想开启调试模式的话,要编译源代码不能直接用rpm的安装方式,我是编译安装的5.7.16的版本,这里记录一下安装过程,以后再用就不用四处查资料了。
这里记录的只是最简单的编译安装模式,只是开启了DEBUG模式。首先编译过程中会产生大于3.6G左右临时文件,时间大约花费30分钟左右。
编译或者安装过程中如果出现任何错误,推荐删除缓存文件,从头再来,笔者抱着侥幸的心试过,后期登录数据库的时候出现了段错误,深层原因是线程违规访问了数据,最根本原因是缺失依赖导致没走mysql的设置文件,走了默认设置,出现了类似不兼容的问题。
1.首先检查必须的依赖软件冲突:
检查mariadb,这个如果不卸载,安装完毕之后启动服务会出错。
[root@5201351 ~]# rpm -qa|grep mariadb mariadb-libs-5.5.41-2.el7_0.x86_64 [root@5201351 ~]# rpm -e mariadb-libs-5.5.41-2.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=1 \ -DDOWNLOAD_BOOST=1 \ -DWITH_BOOST=/usr/local/boost \ -DWITH_DEBUG=1 \ -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 70% of total RAM for dedicated server, else 10%. datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock # Disabling symbolic-links is recommended to prevent assorted security risks # symbolic-links=0 # # 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的错误日志中也有详细记录,有问题先看日志。
安装过程中参考了很多人的文章,不能一一列举,感谢大家的帮助,谢谢!