首发于ACMUG
MySQL代码学习第一——MySQL8.0.15源码编译

MySQL代码学习第一——MySQL8.0.15源码编译

有日子没看MySQL源码了,不能再这样放纵自己了,让我们从8.0开始吧。

先看文档

我的Linux环境

[root@localhost ~]# uname -a
Linux localhost.localdomain 2.6.32-642.el6.x86_64 #1 SMP Tue May 10 17:27:01 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

安装高版本GCC

看到文档里需要GCC5.3以上版本,yum源里没有这么高版本的,编译一套吧。

先学习如何编译GCC,需要先安装一个GCC,然后编译高版本的GCC,有点先有鸡还是先有蛋的意思。

[root@localhost ~]# yum install -y gcc

下了5.5.0的GCC源码包,解压,进目录

一系列需要安装的包,中间由于缺包导致的cmake或者编译错误就不列了。

[root@localhost gcc-5.5.0]# yum install -y libmpc
[root@localhost gcc-5.5.0]# yum install -y gmp-devel
[root@localhost gcc-5.5.0]# yum install -y mpfr-devel
[root@localhost gcc-5.5.0]# yum install -y libmpc-devel
[root@localhost gcc-5.5.0]# yum install glibc   不确认这个需要不需要
[root@localhost gcc-5.5.0]# ./configure --prefix=/usr/local/gcc-5.5.0 --disable-multilib
[root@localhost gcc-5.5.0]# make
[root@localhost gcc-5.5.0]# make install

两个小时,比编译MySQL8.0时间长多了。

--prefix=/usr/local/gcc-5.5.0 指定了安装目录,不想和系统已有的gcc有冲突。

可以准备编译MySQL了

下载的是mysql-boost-8.0.15.tar.gz,包含了boost头文件的包。不然还得单独下载boost。

装个cmake

[root@localhost ~]# yum install -y cmake

建个编译用的目录,注意不要建在源码包解压后的目录下,否则cmake会报错。

[root@localhost source]# mkdir mysql8.0.15bld_debug
[root@localhost source]# cd mysql8.0.15bld_debug/
[root@localhost mysql8.0.15bld_debug]# yum install -y openssl-devel
[root@localhost mysql8.0.15bld_debug]# yum install -y ncurses-devel

设置环境变量,以便在编译的时候使用GCC5.5.0及其lib

[root@localhost mysql8.0.15bld_debug]# CC=/usr/local/gcc-5.5.0/bin/gcc
[root@localhost mysql8.0.15bld_debug]# CXX=/usr/local/gcc-5.5.0/bin/g++
[root@localhost mysql8.0.15bld_debug]# export CC CXX
[root@localhost mysql8.0.15bld_debug]# export LD_LIBRARY_PATH=/usr/local/gcc-5.5.0/lib64

用cmake进行编译配置。

../mysql-8.0.15/ 是我源码解压后的目录;

-DCMAKE_BUILD_TYPE=Debug 是指明编译出一个用来debug(跟踪代码)的版本;

-DWITH_BOOST=../mysql-8.0.15/boost/boost_1_68_0/ 指明boost头文件在哪;

-DCMAKE_INSTALL_PREFIX=/usr/local/mysql80 指明将来make install的时候,把MySQL软件安装在哪里,不设置的话,缺省是/usr/local/mysql;

[root@localhost mysql8.0.15bld_debug]# cmake ../mysql-8.0.15/ -DCMAKE_BUILD_TYPE=Debug -DWITH_BOOST=../mysql-8.0.15/boost/boost_1_68_0/ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql80
[root@localhost mysql8.0.15bld_debug]# make

没报错就是成功了,再安装。

[root@localhost mysql8.0.15bld_debug]# make install

看一下结果

[root@localhost mysql8.0.15bld_debug]# ls -l /usr/local/mysql80/
total 808
drwxr-xr-x.  2 root root   4096 Apr 10 16:55 bin
drwxr-xr-x.  2 root root   4096 Apr 10 16:55 docs
drwxr-xr-x.  3 root root   4096 Apr 10 16:55 include
drwxr-xr-x.  5 root root   4096 Apr 10 16:55 lib
-rw-r--r--.  1 root root 335812 Jan 26 06:33 LICENSE
-rw-r--r--.  1 root root 101810 Jan 26 06:33 LICENSE.router
-rw-r--r--.  1 root root 335812 Jan 26 06:33 LICENSE-test
drwxr-xr-x.  4 root root   4096 Apr 10 16:55 man
drwxr-xr-x. 10 root root   4096 Apr 10 16:55 mysql-test
-rw-r--r--.  1 root root    687 Jan 26 06:33 README
-rw-r--r--.  1 root root    700 Jan 26 06:33 README.router
-rw-r--r--.  1 root root    687 Jan 26 06:33 README-test
drwxrwxr-x.  2 root root   4096 Apr 10 16:55 run
drwxr-xr-x. 28 root root   4096 Apr 10 16:55 share
drwxr-xr-x.  2 root root   4096 Apr 10 16:55 support-files
drwxr-xr-x.  3 root root   4096 Apr 10 16:55 var

大功告成,编译安装MySQL8.0成功了。

现在要把数据库初始化和启动起来

为Linux创建MySQL所使用的用户组和用户,并且更改datadir的属主和属组,此目录用来存放数据文件、日志、socket等。

[root@localhost ~]# groupadd mysql
[root@localhost ~]# useradd -g mysql mysql
[root@localhost ~]# mkdir /data/mysql8015
[root@localhost ~]# mkdir /data/mysql8015/datadir
[root@localhost ~]# chown mysql:mysql /data/mysql8015/datadir/

写个最简单的配置文件,测试环境,尽量不要放在缺省位置。

user:mysqld启动用的Linux用户

basedir:MySQL软件安装目录

datadir:数据文件所在目录

socket:mysql.socket 文件(用于本地socket方式登录)

mysqls.sock:mysqlx.sock 文件

这两个socket如果不指定,会放在/tmp/下面。

log-error:mysqld 日志文件,启动日志、错误日志,都要到这里看

[root@localhost ~]# vim /data/mysql8015/my.cnf
[root@localhost ~]# cat /data/mysql8015/my.cnf
[mysqld]
user             = mysql
basedir          = /usr/local/mysql80
datadir          = /data/mysql8015/datadir
socket           = /data/mysql8015/datadir/mysql.sock
mysqlx_socket    = /data/mysql8015/datadir/mysqlx.sock
log-error        = /data/mysql8015/datadir/mysqlerror.log

可以初始化数据库了。

export LD_LIBRARY_PATH=/usr/local/gcc-5.5.0/lib64 就是前面源码安装gcc的恶果了,后面每次启动都少不了了,跟踪代码时启动也需要了。

--defaults-file=/data/mysql8015/my.cnf 是指定配置文件,依据这个文件进行初始化,创建系统表、InnoDB需要的文件等等。

[root@localhost ~]# cd /usr/local/mysql80/
[root@localhost mysql80]# export LD_LIBRARY_PATH=/usr/local/gcc-5.5.0/lib64
[root@localhost mysql80]# bin/mysqld --defaults-file=/data/mysql8015/my.cnf --initialize --user=mysql
[root@localhost mysql80]# ls -l /data/mysql8015/datadir/
total 155716
-rw-r-----. 1 mysql mysql       56 Apr 11 10:29 auto.cnf
-rw-------. 1 mysql mysql     1680 Apr 11 10:29 ca-key.pem
-rw-r--r--. 1 mysql mysql     1112 Apr 11 10:29 ca.pem
-rw-r--r--. 1 mysql mysql     1112 Apr 11 10:29 client-cert.pem
-rw-------. 1 mysql mysql     1676 Apr 11 10:29 client-key.pem
-rw-r-----. 1 mysql mysql     5750 Apr 11 10:29 ib_buffer_pool
-rw-r-----. 1 mysql mysql 12582912 Apr 11 10:29 ibdata1
-rw-r-----. 1 mysql mysql 50331648 Apr 11 10:29 ib_logfile0
-rw-r-----. 1 mysql mysql 50331648 Apr 11 10:29 ib_logfile1
drwxr-x---. 2 mysql mysql     4096 Apr 11 10:29 #innodb_temp
drwxr-x---. 2 mysql mysql     4096 Apr 11 10:29 mysql
-rw-r-----. 1 mysql mysql      438 Apr 11 10:29 mysqlerror.log
-rw-r-----. 1 mysql mysql 25165824 Apr 11 10:29 mysql.ibd
drwxr-x---. 2 mysql mysql     4096 Apr 11 10:29 performance_schema
-rw-------. 1 mysql mysql     1680 Apr 11 10:29 private_key.pem
-rw-r--r--. 1 mysql mysql      452 Apr 11 10:29 public_key.pem
-rw-r--r--. 1 mysql mysql     1112 Apr 11 10:29 server-cert.pem
-rw-------. 1 mysql mysql     1680 Apr 11 10:29 server-key.pem
drwxr-x---. 2 mysql mysql     4096 Apr 11 10:29 sys
-rw-r-----. 1 mysql mysql 10485760 Apr 11 10:29 undo_001
-rw-r-----. 1 mysql mysql 10485760 Apr 11 10:29 undo_002

看一下日志,有什么问题一般都在日志里提示

[root@localhost mysql80]# more /data/mysql8015/datadir/mysqlerror.log
2019-04-11T02:29:28.656728Z 0 [System] [MY-013169] [Server] /usr/local/mysql80/bin/mysqld (mysqld 8.0.15-debug) initializing of server in progress as process 35097
2019-04-11T02:29:33.955250Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: o2gR?o)&zAxo
2019-04-11T02:29:40.976791Z 0 [System] [MY-013170] [Server] /usr/local/mysql80/bin/mysqld (mysqld 8.0.15-debug) initializing of server has completed

里面提示的临时密码,要在初次登录mysqld时使用。
可以启动了

[root@localhost mysql80]# bin/mysqld_safe --defaults-file=/data/mysql8015/my.cnf --user=mysql &
[1] 35152
[root@localhost mysql80]# 2019-04-11T02:30:18.585133Z mysqld_safe Logging to '/data/mysql8015/datadir/mysqlerror.log'.
2019-04-11T02:30:18.604090Z mysqld_safe Starting mysqld daemon with databases from /data/mysql8015/datadir

看看进程和日志

[root@localhost mysql80]# ps -ef|grep mysql[d]
root     35152 34026  0 10:30 pts/0    00:00:00 /bin/sh bin/mysqld_safe --defaults-file=/data/mysql8015/my.cnf --user=mysql
mysql    35301 35152 32 10:30 pts/0    00:00:02 /usr/local/mysql80/bin/mysqld --defaults-file=/data/mysql8015/my.cnf --basedir=/usr/local/mysql80 --datadir=/data/mysql8015/datadir --plugin-dir=/usr/local/mysql80/lib/plugin --user=mysql --log-error=/data/mysql8015/datadir/mysqlerror.log --pid-file=localhost.localdomain.pid --socket=/data/mysql8015/datadir/mysql.sock
[root@localhost mysql80]# more /data/mysql8015/datadir/mysqlerror.log
2019-04-11T02:29:28.656728Z 0 [System] [MY-013169] [Server] /usr/local/mysql80/bin/mysqld (mysqld 8.0.15-debug) initializing of server in progress as process 35097
2019-04-11T02:29:33.955250Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: o2gR?o)&zAxo
2019-04-11T02:29:40.976791Z 0 [System] [MY-013170] [Server] /usr/local/mysql80/bin/mysqld (mysqld 8.0.15-debug) initializing of server has completed
2019-04-11T02:30:18.951460Z 0 [System] [MY-010116] [Server] /usr/local/mysql80/bin/mysqld (mysqld 8.0.15-debug) starting as process 35301
2019-04-11T02:30:21.044850Z 0 [Warning] [MY-010068] [Server] CA certificate ca.pem is self signed.
2019-04-11T02:30:21.176105Z 0 [System] [MY-010931] [Server] /usr/local/mysql80/bin/mysqld: ready for connections. Version: '8.0.15-debug'  socket: '/data/mysql8015/datadir/mys
ql.sock'  port: 3306  Source distribution.
2019-04-11T02:30:21.286433Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Socket: '/data/mysql8015/datadir/mysqlx.sock' bind-address: '::' port: 33060


登录,输入前面日志中记录的临时密码。然后把密码改成“最强”密码,空的,测试环境嘛,没必要给自己制造麻烦。

[root@localhost ~]# /usr/local/mysql80/bin/mysql -S /data/mysql8015/datadir/mysql.sock -uroot -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.15-debug


Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.


Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.


Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


mysql> show databases;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.


mysql> alter user root@localhost identified by '';
Query OK, 0 rows affected (0.00 sec)
mysql> exit
Bye

不用密码登录,测试一下

[root@localhost ~]# /usr/local/mysql80/bin/mysql -S /data/mysql8015/datadir/mysql.sock -uroot
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 8.0.15-debug Source distribution


Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.


Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.


Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.01 sec)

这下环境都好了,终于可以开始跟踪代码的工作了。

官方文档写得非常好,上面的工作看文档都可以做出来了,赞一下。

编辑于 2019-04-11 15:23