CentOS7源码编译安装MySQL5.7.30
本来以为安装过Redis以及MySQL的rpm包源码安装那是手到擒来,结果墨迹了半个月,对你没看错就是半个月~ 从阅读cmake编译参数到my.cnf文件我把官方文档看了个遍~ 网上大神写的也是阅遍了,但大都千篇一律,有的是远古版本安装,有的根本运行不了,有的甚至参数名都写错了,还都错的一样,当然还有些确实写的不错~ 所以我决定直接看官方文档,毕竟以往都是查看官方文档的~
1. 下载MySQL的源码包
# 安装wget
yum install –y wget
# 下载官方的带boost源码包mysql-boost-5.7.30.tar.gz
wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-boost-5.7.30.tar.gz
# 若下载失败(下载成功此步跳过),可安装rz从本地上传mysql-boost-5.7.30.tar.gz
yum -y install lrzsz
rz
2. 安装依赖
# 先检查有没有安装过mysql或mariadb
rpm -qa |grep mysql
rpm -qa |grep mariadb
# 我有个mariadb-libs-5.5.64-1.el7.x86_64,把它给卸载了
rpm -e --nodeps mariadb-libs-5.5.64-1.el7.x86_64
# 以官方文档安装必备依赖:CMake、make 3.75或更高版本、ANSI C ++编译器、SSL库、Boost C ++库、ncurses相关、bison相关
yum install -y cmake make gcc gcc-c++ openssl openssl-devel ncurses ncurses-devel bison bison-devel
3. 安装MySQL
# 解压缩
tar zxvf mysql-boost-5.7.30.tar.gz
# 进入目录准备生产项目
cd mysql-5.7.30
# 为防止发生错误污染源码,新建个目录进行操作
mkdir bld
cd bld
# 用cmake开始构建项目,用到的参数后面会详细说明
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DSYSCONFDIR=/usr/local/mysql/etc -DWITH_INNOBASE_STORAGE_ENGINE=ON -DWITH_MYISAM_STORAGE_ENGINE=ON -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DENABLED_LOCAL_INFILE=ON -DMYSQL_TCP_PORT=3306 -DMYSQL_UNIX_ADDR=/usr/local/mysql/tmp/mysql.sock -DWITH_INNODB_MEMCACHED=ON -DWITH_BOOST=../boost/boost_1_59_0
# 开始正式编译,你以为刚才那个时间很长?请做好心理准备这个才是地狱。。。短时间别想完
make
# 开始安装,默认/usr/local/mysql
make install
# 若编译失败,解决问题后可清理重新编译(成功就不用运行了)
make clean
rm CMakeCache.txt
# cmake参数解释,仅解释常用配置,详细可官方文档查询,我这是阅遍后总结的
# cmake
# .. 源码目录为上级目录
# -DCMAKE_INSTALL_PREFIX=/usr/local/mysql 指定MySQL安装目录
# -DMYSQL_DATADIR=/usr/local/mysql/data 指定MySQL数据目录
# -DSYSCONFDIR=/usr/local/mysql/etc 指定my.cnf选项文件目录
# -DWITH_INNOBASE_STORAGE_ENGINE=ON Innodb引擎
# -DWITH_MYISAM_STORAGE_ENGINE=ON MyISAM引擎
# -DDEFAULT_CHARSET=utf8 服务器字符集,默认latin1
# -DDEFAULT_COLLATION=utf8_general_ci 服务器排序规则,默认latin1_swedish_ci
# -DENABLED_LOCAL_INFILE=ON 是否为加载数据启用本地,默认为OFF
# -DMYSQL_TCP_PORT=3306 服务器监听端口,默认为3306
# -DMYSQL_UNIX_ADDR=/usr/local/mysql/tmp/mysql.sock Unix套接字文件路径,默认/tmp/mysql.sock
# -DWITH_INNODB_MEMCACHED=ON 是否生成memcached共享库,默认OFF
# -DWITH_BOOST=../boost/boost_1_59_0 Boost库源代码的位置,指向下载的源码包里,相对/绝对路径皆可
4. 初始化数据目录
# 创建mysql用户和组,该用户没有设置登录权限,如需要请自行修改
groupadd mysql
useradd -r -g mysql -s /bin/false mysql
# 进入MySQL安装目录
cd /usr/local/mysql
# 创建相关目录
mkdir -p /usr/local/mysql/data
mkdir -p /usr/local/mysql/etc
mkdir -p /usr/local/mysql/tmp
mkdir -p /usr/local/mysql/logs
# 将目录所有权授予mysql用户和mysql组
chown -R mysql:mysql /usr/local/mysql
# 创建my.cnf配置文件
vi /usr/local/mysql/etc/my.cnf
# 按 i 键进入INSERT模式,粘贴下面配置(本地测试环境虚拟机1C1G,我还总结了一些计算公式,篇幅太长就不粘贴了,欢迎讨论)
[client] #客户端设置
port=3306 #服务器监听端口,默认为3306
socket=/usr/local/mysql/tmp/mysql.sock #Unix套接字文件路径,默认/tmp/mysql.sock
[mysqld] #服务端设置
## 一般配置选项
port=3306 #服务器监听端口,默认为3306
basedir=/usr/local/mysql #MySQL安装根目录
datadir=/usr/local/mysql/data #MySQL数据文件目录
socket=/usr/local/mysql/tmp/mysql.sock #Unix套接字文件路径,默认/tmp/mysql.sock
pid-file=/usr/local/mysql/tmp/mysql.pid #服务进程pid文件路径
character_set_server=utf8 #默认字符集
default_storage_engine=InnoDB #默认InnoDB存储引擎
user=mysql
## 连接配置选项
max_connections=200 #最大并发连接数
table_open_cache=400 #表打开缓存大小,默认2000
open_files_limit=1000 #打开文件数限制,默认5000
max_connect_errors=200 #最大连接失败数,默认100
back_log=100 #请求连接队列数
connect_timeout=20 #连接超时时间,默认10秒
interactive_timeout=1200 #交互式超时时间,默认28800秒
wait_timeout=600 #非交互超时时间,默认28800秒
net_read_timeout=30 #读取超时时间,默认30秒
net_write_timeout=60 #写入超时时间,默认60秒
max_allowed_packet=8M #最大传输数据字节,默认4M
thread_cache_size=10 #线程缓冲区(池)大小
thread_stack=256K #线程栈大小,32位平台196608、64位平台262144
## 临时内存配置选项
tmpdir=/tmp #临时目录路径
tmp_table_size=64M #临时表大小,默认16M
max_heap_table_size=64M #最大内存表大小,默认16M
sort_buffer_size=1M #排序缓冲区大小,默认256K
join_buffer_size=1M #join缓冲区大小,默认256K
## Innodb配置选项
#innodb_thread_concurrency=0 #InnoDB线程并发数
innodb_io_capacity=200 #IO容量,可用于InnoDB后台任务的每秒I/O操作数(IOPS),
innodb_io_capacity_max=400 #IO最大容量,InnoDB在这种情况下由后台任务执行的最大IOPS数
innodb_lock_wait_timeout=50 #InnoDB引擎锁等待超时时间,默认50(单位:秒)
innodb_buffer_pool_size=512M #InnoDB缓冲池大小,默认128M
innodb_buffer_pool_instances=4 #InnoDB缓冲池划分区域数
innodb_max_dirty_pages_pct=75 #缓冲池最大允许脏页比例,默认为75
innodb_flush_method=O_DIRECT #日志刷新方法,默认为fdatasync
innodb_flush_log_at_trx_commit=2 #事务日志刷新方式,默认为0
transaction_isolation=REPEATABLE-READ #事务隔离级别,默认REPEATABLE-READ
innodb_data_home_dir=/usr/local/mysql/data #表空间文件路径,默认保存在MySQL的datadir中
innodb_data_file_path=ibdata1:128M:autoextend #表空间文件大小
innodb_file_per_table=ON #每表独立表空间
innodb_log_group_home_dir=/usr/local/mysql/data #redoLog文件目录,默认保存在MySQL的datadir中
innodb_log_files_in_group=2 #日志组中的日志文件数,默认为2
innodb_log_file_size=128M #日志文件大小,默认为48MB
innodb_log_buffer_size=32M #日志缓冲区大小,默认为16MB
## MyISAM配置选项
key_buffer_size=32M #索引缓冲区大小,默认8M
read_buffer_size=4M #顺序读缓区冲大小,默认128K
read_rnd_buffer_size=4M #随机读缓冲区大小,默认256K
bulk_insert_buffer_size=8M #块插入缓冲区大小,默认8M
myisam_sort_buffer_size=8M #MyISAM排序缓冲大小,默认8M
#myisam_max_sort_file_size=1G #MyISAM排序最大临时大小
myisam_repair_threads=1 #MyISAM修复线程
skip-external-locking #跳过外部锁定,启用文件锁会影响性能
## 日志配置选项
log_output=FILE #日志输出目标,TABLE(输出到表)、FILE(输出到文件)、NONE(不输出),可选择一个或多个以逗>号分隔
log_error=/usr/local/mysql/logs/error.log #错误日志存放路径
log_error_verbosity=1 #错误日志过滤,允许的值为1(仅错误),2(错误和警告),3(错误、警告和注释),默认值为3。
log_timestamps=SYSTEM #错误日志消息格式,日志中显示时间戳的时区,UTC(默认值)和 SYSTEM(本地系统时区)
general_log=ON #开启查询日志,一般选择不开启,因为查询日志记录很详细,会增大磁盘IO开销,影响性能
general_log_file=/usr/local/mysql/logs/general.log #通用查询日志存放路径
## 慢查询日志配置选项
slow_query_log=ON #开启慢查询日志
slow_query_log_file=/usr/local/mysql/logs/slowq.log #慢查询日志存放路径
long_query_time=2 #慢查询时间,默认10(单位:秒)
min_examined_row_limit=100 #最小检查行限制,检索的行数必须达到此值才可被记为慢查询
log_slow_admin_statements=ON #记录慢查询管理语句
log_queries_not_using_indexes=ON #记录查询未使用索引语句
log_throttle_queries_not_using_indexes=5 #记录未使用索引速率限制,默认为0不限制
log_slow_slave_statements=ON #记录从库复制的慢查询,作为从库时生效,从库复制中如果有慢查询也将被记录
## 复制配置选项
server-id=1 #MySQL服务唯一标识
log-bin=mysql-bin #开启二进制日志,默认位置是datadir数据目录
log-bin-index=mysql-bin.index #binlog索引文件
binlog_format=MIXED #binlog日志格式,分三种:STATEMENT、ROW或MIXED,MySQL 5.7.7之前默认为STATEMENT,之后默认为ROW
binlog_cache_size=1M #binlog缓存大小,默认32KB
max_binlog_cache_size=1G #binlog最大缓存大小,推荐最大值为4GB
max_binlog_size=256M #binlog最大文件大小,最小值为4096字节,最大值和默认值为1GB
expire_logs_days=7 #binlog过期天数,默认为0不自动删除
log_slave_updates=ON #binlog级联复制
sync_binlog=1 #binlog同步频率,0为禁用同步(最佳性能,但可能丢失事务),为1开启同步(影响性能,但最安全不会丢失任何事务),为N操作N次事务后同步1次
relay_log=relay-bin #relaylog文件路径,默认位置是datadir数据目录
relay_log_index=relay-log.index #relaylog索引文件
max_relay_log_size=256M #relaylog最大文件大小
relay_log_purge=ON #中继日志自动清除,默认值为1(ON)
relay_log_recovery=ON #中继日志自动恢复
auto_increment_offset=1 #自增值偏移量
auto_increment_increment=1 #自增值自增量
slave_net_timeout=60 #从机连接超时时间
replicate-wild-ignore-table=mysql.% #复制时忽略的数据库表,告诉从线程不要复制到与给定通配符模式匹配的表
skip-slave-start #跳过Slave启动,Slave复制进程不随MySQL启动而启动
## 其他配置选项
#memlock=ON #开启内存锁,此选项生效需系统支持mlockall()调用,将mysqld进程锁定在内存中,防止遇到操作系统导致mysqld交换到磁盘的问题
[mysqldump] #mysqldump数据库备份工具
quick #强制mysqldump从服务器查询取得记录直接输出,而不是取得所有记录后将它们缓存到内存中
max_allowed_packet=16M #最大传输数据字节,使用mysqldump工具备份数据库时,某表过大会导致备份失败,需要增大该值(大>于表大小即可)
[myisamchk] #使用myisamchk实用程序可以用来获得有关你的数据库表的统计信息或检查、修复、优化他们
key_buffer_size=32M #索引缓冲区大小
myisam_sort_buffer_size=8M #排序缓冲区大小
read_buffer_size=4M #读取缓区冲大小
write_buffer_size=4M #写入缓冲区大小
# Esc(退出编辑模式)
# :wq(保存退出)
# :q(不想写了,直接退出)
# :q!(写了一半不想写了,不保存强制退出)
# 使用my.cnf配置文件和mysql用户初始化数据目录
bin/mysqld --defaults-file=/usr/local/mysql/etc/my.cnf --initialize --user=mysql
5. 配置环境变量
# 打开配置文件
vi /etc/profile
# 在文件末尾加入下面代码,:wq保存退出(无权限可:q!强制退出,换root账户重来)
export MYSQL_HOME=/usr/local/mysql
export PATH=$MYSQL_HOME/bin:$PATH
# 使环境变量即时生效
source /etc/profile
6. systemctl方式启动MySQL
# 复制配置文件到系统服务配置
cp support-files/mysql.server /etc/init.d/mysql
# 重新加载系统服务配置
systemctl daemon-reload
# 启动mysql服务
systemctl start mysql
# 下面列出其余systemctl命令(不用运行)
# 查看mysql服务状态
systemctl status mysql
# 停止mysql服务
systemctl stop mysql
# 重新启动mysql服务
systemctl restart mysql
# 配置mysql开机自动启动
systemctl enable mysql
# 配置mysql开机不自动启动
systemctl disable mysql
7. 登录MySQL修改密码
# 查询生成的临时密码
grep "password" /usr/local/mysql/logs/error.log
# 登录mysql
mysql -uroot -p
# Enter password: (输入查询到的临时密码)
# 因为是本地测试环境,所以想把密码改的简单点
# 这密码有够LOW了,但我就是想要
ALTER USER 'root'@'localhost' IDENTIFIED BY '1234';
# 可以退出,试试用新密码重新登录
quit
8. 配置远程连接
# 用新密码登进去试试
mysql -uroot -p
# 授权 所有权限(all),所有数据库(*.*) 给 用户名(root),任何主机(%),密码(yourpassword)
grant all privileges on *.* to 'root'@'%' identified by 'yourpassword' with grant option;
# 刷新权限使其立即生效
flush privileges;
# 退出MySQL
quit
# 查看防火墙状态
systemctl status firewalld
# 查看3306端口状态
firewall-cmd --zone=public --query-port=3306/tcp
# 打开3306端口,--permanent 永久生效(无此参数重启后失效)
firewall-cmd --zone=public --add-port=3306/tcp --permanent
# 重新加载防火墙
firewall-cmd --reload
# 下面列出相关命令给喜欢折腾的朋友(教程已完结后面不用依次执行了)
# 开启防火墙
systemctl start firewalld
# 关闭防火墙
systemctl stop firewalld
# 删除3306端口
firewall-cmd --zone=public --remove-port=3306/tcp --permanent
在外面用Navicat等可视化工具测试了下,可以远程连接数据库了,可劲造吧。。。
参考官方文档:
官方下载地址:https://dev.mysql.com/downloads/mysql/
官方安装文档:https://dev.mysql.com/doc/refman/5.7/en/installing-source-distribution.html
camke参数详解:https://dev.mysql.com/doc/refman/5.7/en/source-configuration-options.html
安装后设置和测试文档:https://dev.mysql.com/doc/refman/5.7/en/postinstallation.html
SSL/RSA配置加密连接:https://dev.mysql.com/doc/refman/5.7/en/mysql-ssl-rsa-setup.html
服务器选项变量参考:https://dev.mysql.com/doc/refman/5.7/en/server-option-variable-reference.html
MYSQL使用的环境变量:https://dev.mysql.com/doc/refman/5.7/en/environment-variables.html
复制和二进制日志选项参考:https://dev.mysql.com/doc/refman/5.7/en/replication-options-reference.html
InnoDB启动配置:https://dev.mysql.com/doc/refman/5.7/en/innodb-init-startup-configuration.html
MYSQL5.6服务器默认值:https://dev.mysql.com/doc/refman/5.6/en/server-default-changes.html