Fork me on GitHub

MySQL源码安装

MySQL源码安装,本例以在CentOS7上安装MySQL5.7为例

下载地址

https://dev.mysql.com/downloads/mysql/5.7.html#downloads

mysql

安装依赖包

CentOS:

yum -y install gcc gcc-c++ cmake bison bison-devel ncurses ncurses-devel openssl-devel

Ubuntu:

apt-get install cmake libncurses5-dev pkg-config openssl libssl-dev    

创建用户和组

groupadd mysql
useradd -g mysql -s /sbin/nologin -M mysql

创建文件目录

mkdir -p /usr/local/mysql
mkdir -p /usr/local/boost
mkdir -p /data/mysql

修改目录权限:

chown -R mysql:mysql /usr/local/mysql
chown -R mysql:mysql /data/mysql

预编译

cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
        -DMYSQL_DATADIR=/data/mysql \
        -DSYSCONFDIR=/etc \
        -DMYSQL_UNIX_ADDR=/tmp/mysql.sock \
        -DDEFAULT_CHARSET=utf8mb4 \
        -DDEFAULT_COLLATION=utf8mb4_unicode_ci \
        -DDOWNLOAD_BOOST=1  \   #若boost已经下载更改为0即可
        -DWITH_BOOST=/usr/local/boost

注意:
1、编译过程需要较长的时间,需耐心等待。
2、重新cmake时,由于cmake生成临时文件CMakeCache.txt,需要先删除CMakeCache.txt文件,避免不必要的错误,即

rm CMakeCache.txt

编译之后安装

make install

配置环境变量

可编辑/etc/profile,增加内容:

PATH=$PATH:/usr/local/mysql/bin
export PATH

初始化

–initialize-insecure 不会生成密码
-–initialize 会生成一个随机密码
-–datadir 目标目录下不能有数据文件

初始化命令:

mysqld --defaults-file=/etc/my.cnf \
    --user=mysql \
    --basedir=/usr/local/mysql \
    --datadir=/data/mysql \
    --initialize

如果需要重新初始化,清空datadir即可:

rm -fr /data/mysql/*

备注:5.7之前的版本采用mysql_install_db初始化

配置mysql服务

cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql

启动服务

service mysql status/start/stop
或者 
systemctl enable mysql
systemctl status/start/stop mysql

如果启动失败,查看/etc/my.cnf文件:

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
# Settings user and group are ignored when systemd is used.
# If you need to run mysqld under a different user or group,
# customize your systemd unit file for mariadb according to the
# instructions in http://fedoraproject.org/wiki/Systemd

[mysqld_safe]
log-error=/var/log/mariadb/mariadb.log
pid-file=/var/run/mariadb/mariadb.pid

修改/etc/my.cnf文件,配置见【配置关键参数】

配置root登录密码

mysql_secure_installation

执行时出现”Can’t connect to local MySQL server through socket”错误时,尝试增加配置:

[client]
socket   = /tmp/mysql.sock 

创建远程访问用户

grant select, insert, update, delete on jasonhzy.* to 'test'@'%' identified by 'test';
flush privileges;

配置关键参数

[client]
port     = 3306
socket   = /tmp/mysql.sock
default-character-set = utf8mb4

[mysql]
default-character-set=utf8mb4

[mysqld]
# 监听的TCP/IP端口
port     = 3306
# mysql安装路径
basedir  = /usr/local/mysql
# 数据文件位置
datadir  = /data/mysql
# mysql socket连接文件
socket   = /tmp/mysql.sock
# mysql进程的文件
pid-file   = /data/mysql/mysql.pid
#  错误日志文件
log-error  = /data/mysql/mysql-error.log

# 字符集
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# init_connect = 'SET NAMES utf8mb4'
# skip-character-set-client-handshake = true

# 禁用自动提交方式
# autocommit=0

# explicit_defaults_for_timestamp = true
# 设置时区
# default-time-zone = '+8:00'

# 库名、表名是否区分大小写。默认为0区分大小写。设置1不区分大小写,创建的表、数据库都以小写形式存放磁盘
# lower_case_table_names = 0

# 不在tcp/ip端口上进行监听,所有的连接都是通过本地的socket文件连
# skip-networking
# 禁用DNS查询,不能在mysql的授权表中使用主机名,只能使用IP,例如:
# grant all on test.* to root@localhost 这是不行的
skip-name-resolve

# 默认存储引擎
default-storage-engine = InnoDB

# MySQL支持4种事务隔离级别,他们分别是:
# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE
# 若未指定,mysql默认采用的是REPEATABLE-READ,ORACLE默认的是READ-COMMITTED
transaction_isolation = REPEATABLE-READ

# 是否开启慢查询日志,1表示开启,0表示关闭
slow-query-log = 1
# 慢查询日志文件位置
slow-query-log-file= /data/mysql/mysql-slow.log
# 所有的使用了比这个时间(以秒为单位)更多的查询会被认为是慢速查询.
# long_query_time = 10
# 日志存储方式。log_output='FILE'表示将日志存入文件,默认值是'FILE'。
# log_output='TABLE'表示将日志存入数据库,这样日志信息就会被写入到mysql.slow_log表中。
# MySQL数据库支持同时两种日志存储方式,配置的时候以逗号隔开即可,如:log_output='FILE,TABLE'。
# 日志记录到系统的专用日志表中,要比记录到文件耗费更多的系统资源,因此对于需要启用慢查询日志,
# 又需要能够获得更高的系统性能,那么建议优先记录到文件
# log_output=FILE

# 指定mysql服务所允许的最大连接进程数,若访问时经常出现"Too Many Connections"的错误提示,则需要增大该参数值。
max_connections = 1000
# 每个主机连接允许异常中断的次数,当超过该次数mysql服务将禁止该主机的连接请求。若让禁止的host仍可连接,方法如下:
# 1、重启mysql服务 2、flush hosts 3、mysqladmin flush-hosts -hlocalhost -P 3306 -uroot -p  
max_connect_errors = 1000000

# 服务器标识id(用于主从复制)
server-id  = 10
# 二进制日志存放路径
log_bin = mysql-bin
log_bin_index = /data/mysql/mysql-bin.index
# binlog格式,复制有3种模式STATEMENT,ROW,MIXED
binlog_format = row

# 如果你在使用链式从服务器结构的复制模式 (A->B->C),
# 你需要在服务器B上打开此项.
# 此选项打开在从线程上重做过的更新的日志,
# 并将其写入从服务器的二进制日志.
# log_slave_updates

# 独立表空间,每个表的数据和索引单独存放在以表命名的.ibd文件中,最好在安装数据库就设置,使用之后再设置可能无法重启
# 节省空间/提升性能,但单表增加过大
innodb-file-per-table  = 1

# 缓冲池大小,对Innodb表来说非常重要,一般设置为主机内存的70~80%
innodb_buffer_pool_size = 6G

# 1)为0,log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行. 当事务提交时,不做日志写入操作。
#   当MySQL Crash和OS Crash或者主机断电之后,可能会丢失上一秒的事务数据
# 2)为1,每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去。最安全的设置,能够保证不论
#   是MySQL Crash还是OS Crash或者是主机断电都不会丢失任何已经提交的数据
# 3)为2,每次事务提交时MySQL都会把log buffer的数据写入log file.但是flush(刷到磁盘)操作并不会同时进行。该模式下MySQL
#  会每秒定时执行一次flush(刷到磁盘)操作。MySQL Crash并不会造成数据的丢失,但是OS Crash或者是主机断电后可能丢失
# 简单说来,可选值的安全性从0->2->1递增,分别对应于mysqld进程crash可能丢失 -> OS crash可能丢失 -> 事务安全。
innodb_flush_log_at_trx_commit = 2

#开启gtid
gtid_mode=ON
enforce-gtid-consistency=ON

[mysqldump]                        
max_allowed_packet = 256M
# mysqldump导出大表时很有用,强制从服务器查询取得记录直接输出,而不是取得所有记录后将它们缓存到内存中。
quick

参考资料

全面了解mysql锁机制(InnoDB)与问题排查
MySQL 加锁处理分析

轻轻的我走了,正如我轻轻的来