目录

  • 前言
  • 正文
  • 下载
  • 安装编译工具
  • 编译和安装
  • 启动
  • 客户端连接
  • 一点小帮助
  • 结语
  • 参考文献
  • 童鞋们,码字不易,一键三连再走吧


前言

由于工作需要,小编这两个星期分别在CentOS 8和Ubuntu 18.04 LTS的平台上进行了MySQL 5.7源码版的编译、安装和启动过程,与所有大型软件的安装过程一样,十分让人头秃,一脚踩进深坑,从此头发哗啦啦地掉啊…
借着这次总结,把这个流程梳理一遍,让在座地各位童鞋少踩坑,多保留些头发-v-

正文

这里先简单谈谈编译源码版MySQL的意义所在,如下是MySQL官网的一句原话:

Building MySQL from the source code enables you to customize build parameters, compiler optimizations, and installation location.

自定义生成参数、编译器优化和安装位置这些好处能使我们对MySQL有个更清晰地认识,就小编的体验来说,在开发过程中如用python/java调用MySQL时能更加明白这些接口参数的意义。下面就开始讲解这一过程吧。

下载

下载最新的MySQL源码包其实挺容易的,但是下载指定的历史版本就不太容易了,小编这里用的是MySQL 5.7.19,而官网现在只有5.7.30了,而且下载速度贼慢!!!下载相关资料可以见参考文献。另外,小编也把自己用的MySQL_5.7.19+boost_1.59.0资源放到了上,可以在参考文献处找到链接。

安装编译工具

编译MySQL源码是需要编译工具,在linux平台如Unbuntu,要安装这些工具非常容易,这里直接给出命令:

sudo apt install make cmake gcc g++ perl bison libaio-dev libncurses5 libncurses5-dev libnuma-dev

Tips:
Centos平台命令用的是yum,同时这些编译工具名字也会有所不同!

编译和安装

这一步首先要有个Boost C++ libraries,版本需要跟MySQL搭配好,本文中的MySQL 5.7需要的是Boost 1.59,这里小编提供的资源,是打包好Boost的,是不是很友好^ - ^。接下来步骤如下:

  1. 解压源文件
tar -zxvf src_file -C dest_dir
  1. 编译
    进入解压缩后的源码目录下,利用CMake工具编译:
cmake . \
-DWITH_BOOST=/data/yifan/mysql_test/mysql5-src/mysql-5.7.19/boost/boost_1_59_0 \
-DCMAKE_INSTALL_PREFIX=/data/yifan/mysql_test/mysql5-compile \
-DMYSQL_DATADIR=/data/yifan/mysql_test/mysql5-compile/data \
-DMYSQLX_TCP_PORT=6789 \
-DMYSQL_UNIX_ADDR=/data/yifan/mysql_test/mysql.sock \
-DMYSQL_TCP_PORT=5678 \
-DMYSQLX_UNIX_ADDR=/data/yifan/mysql_test/mysqlx.sock \
-DDEFAULT_CHARSET=utf8 \
-DWITHOUT_CSV_STORAGE_ENGINE=1 \
-DWITHOUT_BLACKHOLD_STORAGE_ENGINE=1 \
-DWITHOUT_FEDERATED_STORAGE_ENGINE=1 \
-DWITHOUT_ARCHIVE_STORAGE_ENGINE=1 \
-DWITHOUT_MRG_MYISAM_STORAGE_ENGINE=1 \
-DWITHOUT_NDBCLUSTER_STORAGE_ENGINE=1 \
-DFORCE_INSOURCE_BUILD=1 \
-DCMAKE_CXX_COMPILER=/usr/bin/g++ \
-DCMAKE_C_COMPILER=/usr/bin/gcc

这些参数都非常重要,小编建议尝试自定义的参数是从DWITH_BOOST到DMYSQLX_UNIX_ADDR。很多教程都是按照官网的来,比如MySQL服务端的监听端口设置为3306,安装目录设置/usr/local/mysql,数据目录设置为/usr/local/mysql/data等等,这挺好的,但是如果平台已经有安装好的数据库,你现在要来练手,那就不能这样做了,还是需要自定义位置,弄清楚这些参数的意义才行。小编这里给出了demo,大家可以参考。
Tips:
端口设置虽然不需要按照默认的3306来,但是也是需要事先判断要用的端口有没有被其他程序占用,命令如下:

# lsof -i:port
lsof -i:5678
  1. 安装
    还是源码的这个目录,执行下面命令来安装
make install

Tips:
童鞋们最好先把/data/yifan目录的权限修改为自己这个用户yifan,不然会出现权限问题。

启动

MySQL服务端启动时是mysqld,在mysql安装目录下的bin目录中,客户端命令mysql也在其中。先进入该目录下,然后启动命令如下:

# 初始化
mysqld [--defaults-file=/data/yifan/mysql_test/mysql.cnf] --initialize-insecure --user yifan 
# 启动
mysqld [--defaults-file=/data/yifan/mysql_test/mysql.cnf] [&]

解释一波~~命令中[]是可选参数,如果前面的编译安装环节出了错,这里可以自己生成一个mysql.cnf配置文件,让mysqld启动时采用它而不是默认配置启动;initialize-insecure初始化后root用户没有密码;user就用之前安装目录所属的用户即可。小编特别提示一下,了解一下mysql.cnf是非常有必要的,而且启动过程很容易出问题,mysql.cnf还会告诉我们error.log在哪里,这样我们就知道出现了哪些errors;& 由于服务器启动就不再关闭了,所以加个&,让它进入后台运行。这里给个mysql.cnf模板:

[mysql]
port=5678
user=yifan
default-character-set=utf8
no-auto-rehash

[client]
user=yifan
port=5678
socket=/data/yifan/mysql_test/mysql5-data/my5678/run/mysql.sock

[mysqld]
basedir=/data/yifan/mysql_test
datadir=/data/yifan/mysql_test/mysql5-data/my5678/data
socket=/data/yifan/mysql_test/mysql5-data/my5678/run/mysql.sock
tmpdir=/data/yifan/mysql_test/mysql5-data/my5678/tmp
lc_messages_dir=/data/yifan/mysql_test/mysql5_compile/share
lc_messages = en_US
slow_query_log_file=/data/yifan/mysql_test/mysql5-data/my5678/log/slow.log
general_log_file=/data/yifan/mysql_test/mysql5-data/my5678/log/general.log
log_error=/data/yifan/mysql_test/mysql5-data/my5678/tmp/error.log

#innodb
innodb_data_home_dir=/data/yifan/mysql_test/mysql5-data/my5678/data
innodb_log_group_home_dir=/data/yifan/mysql_test/mysql5-data/my5678/data
innodb_data_file_path = ibdata1:1G;ibdata2:1G:autoextend
innodb_buffer_pool_instances=8
innodb_log_files_in_group=4
innodb_log_file_size=1G
innodb_log_buffer_size=200M
innodb_flush_log_at_trx_commit=0
innodb_max_dirty_pages_pct=60
innodb_io_capacity_max=100000
innodb_io_capacity=20000
innodb_thread_concurrency=64
innodb_read_io_threads=8
innodb_write_io_threads=8
innodb_open_files=615350

#innodb_file_format=Barracuda
innodb_file_per_table=1
innodb_flush_method=O_DIRECT
innodb_adaptive_flushing=1
transaction-isolation=READ-COMMITTED
innodb_buffer_pool_size=32G

#binlog
log-bin=/data/yifan/mysql_test/mysql5-data/my5678/log/mysql-bin
server_id=406590050
max_binlog_cache_size=2G
max_binlog_size=500M
binlog-format=ROW
sync_binlog=0

#server
default-storage-engine=INNODB
character-set-server=utf8
lower_case_table_names=1
skip-external-locking
open_files_limit=615350
safe-user-create
local-infile=1
sql_mode='NO_ENGINE_SUBSTITUTION'
performance_schema=0
default_authentication_plugin=mysql_native_password
port=5678
skip-name-resolve
skip-ssl
max_connections=60000
max_user_connections=50000
max_connect_errors=65536
max_allowed_packet=1G
innodb_use_native_aio=1

# kv
loose_innodb_api_trx_level=1
loose_daemon_memcached_values_delimiter=':;:'
#loose_daemon_memcached_option="-t 32 -c 8000 -p 5678"

#double write
innodb_doublewrite=1

Tips:
这一步启动是比较容易出各种问题的,童鞋们一定要找到error.log文件,查看启动情况。若一切顺利,初始化的时候应该会生成无密码的root用户,正式启动的时候会出现[Note] mysqld: ready for connections.以及sock生成位置等信息。

客户端连接

在MySQL服务端启动后,我们就可以用客户端去连接并操纵数据库了,在Linux平台下有两种连接方式:基于socket和基于TCP/IP。客户端连接命令如下:

# 基于socket
# 第一种,mysql.sock正常
mysql -uroot -p
# 第二种,mysql.sock找不到,那就需要去拷贝一份正常的sock
mysql --socket=/data/yifan/mysql_test/mysql.sock -uroot -p
# 基于TCP/IP
# 第三种,通过网络连接
mysql -h IP -uroot -p -P5678

Tips:
通过网络连接是常用的方式,但是我们需要提前让数据库开通IP连接的权限,步骤应该是先去mysql数据库中的user表查看用户开通访问的IP,如果没有就要自己增添权限,命令如下:

# 查看用户开放的IP
USE mysql;
SELECT user,authentication_string,host FROM USER;
# 赋予所有主机连接该数据库root用户的权限并刷新
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
flush privileges;

一点小帮助

很多时候我们会频繁使用mysql客户端命令,而前面自定义安装的方式,每次都需要进入安装目录下找到mysql命令,这很麻烦,所以我们可以创建一个软连接(类似于windows的快捷方式),放在系统目录下,所有用户都能直接访问到。命令如下:

ln -s /data/yifan/mysql_test/mysql5-compile/bin/mysql /usr/bin/mysql_yf

结语

MySQL以前是非常流行的开源的关系型数据库,很多企业都在使用,而且研发岗面试的时候也基本上都会被问上几道题。本文提供的知识点算是给个好开头,毕竟大型软件的部署安装都是令人头秃的事情,因此打消学习积极性就不好了-v-。

参考文献

  1. 官网:https://dev.mysql.com/doc/refman/5.7/en/source-installation.html
  2. 下载:https://developer.aliyun.com/article/443112
  3. https://www.jianshu.com/p/117dab1b658d

童鞋们,码字不易,一键三连再走吧