源码编译安装Mysql-5.7.21 for Centos 7.x Linux

大概步骤如下:

  1. 关闭防火墙
  2. 配置sysctl.conf
  3. 检查操作系统是否安装了mysql
  4. 下载mysql源码包
  5. 添加用户和组
  6. 配置mysql环境便令
  7. 创建目录并授权
  8. 解压mysql
  9. 配置yum源,安装cmake
  10. 编译安装
  11. mysql参数配置
  12. 初始化mysql脚本
  13. 启动mysql
  14. 登录mysql

关闭防火墙

systemctl status firewalld 查看防火墙状态
systemctl stop firewalld 关闭防火墙
关闭selinux
vi /etc/selinux/config,将SELNUX=enconfig更改为:disabled

配置sysctl.conf

正式服务器,配置,个人使用就配置,主要是优化了mysql跟操作系统。

查看mysql是否安装

rpm -qa |grep mysql
删除mysql:rpm -e mysql.xxx / yum remove -y mysql
重点来了:
centos 7 因为mysql收费的原因,不在支持mysql,转而内部集成mariadb,那么首先要卸载mariabd
rpm -qa | grep mariadb
如果有依赖,就强制卸载即可
rpm -e --nodeps mariadb-libs-5.x

下载mysql源码包

在http://mysql.com上下载通用的linux源码
可以直接在服务器上安装wget命令,得到mysql源码下载目录,即可下载。
如:wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24.tar.gz

添加mysql组

查询mysql是否存在,id mysql
存在删除 userdel -r msql
groupadd mysql
useradd -d /home/mysql -g mysql -m mysql
修改密码:passwd mysql ...

设置环境变量

切换到mysql用户下:su - mysql

vi .bash_profile
在PATH=HOME/bib:后面添加mysql bin目录。

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin:/u01/my3306/mysql/bin

export PATH

/u01/my3306/mysql/bin是我的mysql bin目录
保存退出,执行source .bash_profile,加载bash_profile

创建目录并授权

mkdir -p /u01/my3306/mysql
mkdir -p /u01/my3306/mysql/data
mkdir -p /u01/my3306/mysql/tmp
mkdir -p /u01/my3306/mysql/log/iblog
mkdir -p /u01/my3306/mysql/log/binlog
mkdir -p /u01/my3306/mysql/run
授权:
chown -R mysql:mysql /u01/my3306
对/u01目录授予mysql:mysql组用户的权限
chmod -R 775 /u01/my3306
更改目录权限

解压mysql

tar -zxvf mysql-boost-5.7.21.tar.gz

安装cmake编译工具

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

下载boost软件

boost历史版本

注意: mysql5.7.2x版本的必须指定1.5.9的boost,高版本不行
放到指定目录解压即可

进行cmake编译mysql源文件

在mysql源代码目录下执行

cmake \
-DCMAKE_INSTALL_PREFIX=/u01/my3306/mysql \
-DMYSQL_DATADIR=/u01/my3306/mysql/data \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DEXTRA_CHARSETS=all \
-DWITH_EMBEDDED_SERVER=1 \
-DENABLED_LOCAL_INFILE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DMYSQL_UNIX_ADDR=/u01/my3306/mysql/run/mysql.sock \
-DMYSQL_TCP_PORT=3306 \
-DSYSCONFDIR=/etc \
-DMYSQL_USER=mysql \
-DENABLE_DOWNLOADS=1 \
-DWITH_BOOST=/u01/my3306/mysql/boost \
-DWITH_READLINE=on

通过阅读官方文件http://dev.mysql.com/doc/refman/5.6/en/source-configuration-options.html,去除选项-DWITH_READLINE=1和-DWITH_SSL=YES

报错:

CMake Error at cmake/boost.cmake:81 (MESSAGE):
  You can download it with -DDOWNLOAD_BOOST=1 -DWITH_BOOST=

  This CMake script will look for boost in .  If it is not there,
  it will download and unpack it (in that directory) for you.

  If you are inside a firewall, you may need to use an http proxy:

  export http_proxy=http://example.com:80

Call Stack (most recent call first):
  cmake/boost.cmake:238 (COULD_NOT_FIND_BOOST)
  CMakeLists.txt:507 (INCLUDE)


-- Configuring incomplete, errors occurred!
See also "/u01/my3306/mysql-5.7.21/CMakeFiles/CMakeOutput.log".
See also "/u01/my3306/mysql-5.7.21/CMakeFiles/CMakeError.log".
需要添加boost
1. 下载boost
2. 解压到mysql的安装目录下,新建一个boost目录
3. 在cmake参数中添加
-DWITH_BOOST=/u01/my3306/mysql/boost \ 

boost下载:https://www.boost.org/users/download/
对应1.5.9版本

进行编译安装

make & make install
make 进行编译,这里时间比较久
make install 进行安装

mysql参数my.cnf配置

[client]
port=3306
socket=/u01/my3306/mysql/run/mysql.sock

[mysql]
socket=/u01/my3306/mysql/run/mysql.sock

[mysqld]
autocommit=1
general_log=off
explicit_defaults_for_timestamp=true

# system
basedir=/u01/my3306/mysql
datadir=/u01/my3306/mysql/data/
open_files_limit=10240
# 控制mysql接收数据包的大小,主从应该保证一致
max_allowed_packet=32m
# 控制允许的最大连接数
max_connections=2000
# 最大用户连接不宜过大
 max_user_connections=200
wait_timeout=100
pid_file=/u01/my3306/mysql/run/mysqld.pid
port=3306
server_id=101
# 禁用DNS查找
skip_name_resolve=ON
socket=/u01/my3306/mysql/run/mysql.sock
tmpdir=/u01/my3306/mysql/tmp
# 默认值5000
open_files_limit=5000
# 设置 LOAD DATA and  SELECT ... INTO OUTFILE 导出限制
secure_file_priv=''

# bin log 
log_bin=/u01/my3306/mysql/log/binlog/binlog
binlog_cache_size=32768
binlog_format=row
# 保留bin-log保存的日期
expire_logs_days=3
log_slave_updates=ON
max_binlog_size=512M
log-bin-index=binlog.index
# 控制mysql如何想磁盘刷新binlog,默认为0,建议设置为1,
sync_binlog=1

# logging
log_error=/u01/my3306/mysql/log/mysql_error.err
slow_query_log_file=/u01/my3306/mysql/log/slow.log
log_queries_not_using_indexes=0
slow_query_log=1
log_slave_updates=ON
log_slow_admin_statements=1
long_query_time=1

# relay
relay_log=/u01/my3306/mysql/log/relaylog
relay_log_index=/u01/my3306/mysql/log/relay.index
relay_log_info_file=/u01/my3306/mysql/log/relay-log.info

# slave 
slave_load_tmpdir=/u01/my3306/mysql/tmp
slave_skip_errors=OFF
# 禁止非super权限的用户写权限,一定要在从库启用
# read_only=1

# innodb
innodb_data_home_dir=/u01/my3306/mysql/log/iblog
innodb_log_group_home_dir=/u01/my3306/mysql/log/iblog
innodb_adaptive_flushing=ON
innodb_adaptive_hash_index=ON
innodb_autoinc_lock_mode=1
innodb_buffer_pool_instances=8

# default 
innodb_change_buffering=inserts
innodb_buffer_pool_size=256M
innodb_data_file_path=ibdata1:32M;ibdata2:16M:autoextend
# 控制双写缓冲,避免页损坏
innodb_doublewrite=1
# 为每一张表建立一个单独的表空间,不使用系统表空间
innodb_file_per_table=1
# 系统提交事务的方式: 2:每次事物提交,执行log数据写入catch,每秒执行一次flush log到磁盘
innodb_flush_log_at_trx_commit=2
# 文件交换的方式,linux服务器设置为O_DIRECT即可
innodb_flush_method=O_DIRECT
innodb_io_capacity=1000
innodb_lock_wait_timeout=10
innodb_log_buffer_size=20M
innodb_log_file_size=100M
innodb_log_files_in_group=4
innodb_max_dirty_pages_pct=60
# 不能大于open_file_limit
innodb_open_files=4000
innodb_purge_threads=1
innodb_read_io_threads=4
innodb_stats_on_metadata=OFF
innodb_support_xa=ON
innodb_use_native_aio=OFF
innodb_write_io_threads=10

[mysqldump]
quick
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

[mysqld_safe]
basedir=/u01/my3306/mysql
datadir=/u01/my3306/mysql/data
pid_file=/u01/my3306/mysql/run/mysqld.pid
tmpdir=/u01/my3306/mysql/tmp

进行初始化数据库和密码

./mysqld --initialize --user=mysql --basedir=/u01/my3306/mysql --datadir=/u01/my3306/mysql/data --default-files=/u01/my3306/mysql/my.cnf
注意:所有的报错信息都将会在配置的mysql-err.err日志中体现,如果没有配置这个日志,将会在控制台直接输出。

注意:此条语句执行时容易报错,成功至少要满足以下几个条件
1. /u01/my3306/mysql/data目录存在并且一定要为空目录,否则报错;
2. 如果本机已经存在了其余的mysql,请确实/etc/my.cnf文件不存在,否则会按照/etc/my.cnf中的设置进行初始化,datadir会读取另一个mysql实例的路径,从而导致报错。遇到此情况,可以先将已经存在的mysql实例停止,然后将/etc/my.cnf文件剪切到此实例对应的datadir目录中,再启动此实例,然后重新执行初始化命令;

报错:
2018-03-21T03:53:19.536884Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2018-03-21T03:53:19.539255Z 0 [ERROR] --initialize specified but the data directory has files in it. Aborting.
2018-03-21T03:53:19.539297Z 0 [ERROR] Aborting
  1. 提示timestamp有警告,需要禁用某些非标准的行为。
  2. data数据库目录已经存在文件,需要先删除该目录下的所有文件。
    官网:详情请查看

注意:my.cnf的权限设置为644,chmod 644 my.cnf 用户设置为mysql 这是mysql的安全机制。

[root@lnlr bin]# ./mysqld --initialize --defaults-file=/u01/my3306/mysql/my.cnf --user=mysql --basedir=/u01/my3306/mysql --datadir=/u01/my3306/mysql/data 
2018-03-21T03:42:15.884264Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2018-03-21T03:42:16.945180Z 0 [Warning] InnoDB: New log files created, LSN=45790
2018-03-21T03:42:17.242546Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2018-03-21T03:42:18.471497Z 0 [ERROR] unknown variable 'defaults-file=/u01/my3306/mysql/my.cnf'
2018-03-21T03:42:18.471564Z 0 [ERROR] Aborting
提示找不到--defaults-file=/u01/my3306/mysql/my.cnf这个变量
原因:
mysql寻找my.cnf的顺序
/etc/my.cnf
/etc/mysql/my.cnf
$mysql_home/my.cnf
~/.my.cnf
解决办法:
将/etc/my.cnf进行删除,然后把启动命令的顺序进行调整。
将--defaults-file调整到--initialize前面即可
正确命令: ./mysqld  --defaults-file=/u01/my3306/mysql/my.cnf --initialize --user=mysql --basedir=/u01/my3306/mysql --datadir=/u01/my3306/mysql/data 

正确后的输出:
2018-03-21T03:59:48.606609Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2018-03-21T03:59:50.068792Z 0 [Warning] InnoDB: New log files created, LSN=45790
2018-03-21T03:59:50.164896Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2018-03-21T03:59:50.226389Z 0 [Warning] No existing UUID has been found, so we assume that this is the first time that this server has been started. Generating a new UUID: 4d9ac927-2cbc-11e8-932c-000c29ca223e.
2018-03-21T03:59:50.227839Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2018-03-21T03:59:50.532475Z 0 [Warning] CA certificate ca.pem is self signed.
2018-03-21T03:59:50.684543Z 1 [Note] A temporary password is generated for root@localhost: 6GttX,)_-paX
最后一行是密码

初始化正确命令,无密码

./mysqld --defaults-file=/u01/my3306/mysql/my.cnf --initialize-insecure --user=mysql --basedir=/u01/my3306/mysql --datadir=/u01/my3306/mysql/data
参数说明:

--initialize 是使用mysqld初始化数据库,并且生成数据库密码
--initialize-insecure  同上,但是不初始化数据库密码
无论平台如何,都 --initialize用于“ 默认安全 ”安装(即包括生成随机初始`root`密码)。在这种情况下,密码被标记为过期,
您将需要选择一个新密码。使用该 --initialize-insecure选项,不会 `root`生成密码; 假设您在将服务器投入生产之前将及时为帐户分配密码。
--defaults-file 指定使用my.cnf配置文件
--basedir数据库的根目录
--datadir数据库数据文件目录

安全启动mysql数据库

启动命令:
./mysqld_safe --user=mysql --defaults-file=/u01/my3306/mysql/my.cnf &
ctrl+c结束
ps -ef | grep mysql查看mysql进程
[root@lnlr bin]# ps -ef | grep mysql
root      8701 25911  0 13:24 pts/0    00:00:00 /bin/sh ./mysqld_safe --defaults-file=/u01/my3306/mysql/my.cnf
mysql     8761  8701  0 13:24 pts/0    00:00:00 /u01/my3306/mysql/bin/mysqld --defaults-file=/u01/my3306/mysql/my.cnf --basedir=/u01/my3306/mysql --datadir=/u01/my3306/mysql/data --plugin-dir=/u01/my3306/mysql/lib/plugin --user=mysql --log-error=lnlr.err --pid-file=lnlr.pid
root      9218 25911  0 13:29 pts/0    00:00:00 ./mysql -uroot -p
root      9250  7572  0 13:29 pts/1    00:00:00 grep --color=auto mysql
启动mysql数据库:
1. 使用mysqld 启动
2. 使用mysqld_safe安全启动
却别:
安全启动的好处为在误杀了mysql进程的时候,mysqld_safe守护进程将会自动的把mysqld进程启动起来。
小板凳: 我使用mysqld_safe启动的时候,拷贝命令将会报找不到--defaults-file,手动敲入就可以。很奇怪。

登录mysql,并修改密码

./mysql -uroot -p
输入密码进行登录
修改密码:
alter user 'root'@'localhost' identified by 'root';

处理远程登录

通过以上步骤,在localhost可以使用mysql,但是想要远程访问,将会报错。
ERROR 1130: Host '192.168.21.249' is not allowed to connect to this MySQL
原因:防火墙或该用户只能localhost访问。
解决办法:
1. 将mysql数据库下user表中的host字段更改为%即可
use mysql; update user set host = '%' where user = 'root'; quit;
重新启动mysql数据库即可,三条命令一次性执行;还可以将更改密码同时放入。

2. 可以利用授予权限
没尝试

后续设置

1. 将/u01/my3306/mysql/my.cnf拷贝到/etc目录下,mysql默认先寻找该目录,这样免得每次启动都需要带上--defaults-file路径
cp /u01/my3306/mysql/my.cnf /etc

2. 将安装目录下的/u01/my3306/mysql/support-files/mysql.server拷贝到/etc/init.d目录下
cp /u01/my3306/mysql/support-files/mysql.server /etc/init.d

3. 添加mysql.server到服务中
chkconfig --add mysql.server

4. 测试使用systemctl 启动mysql
systemctl start mysql.server

5. 查看是否启动成功
ps -ef | grep mysql
有mysql服务则启动成功

6. 添加到linux服务器开机自启动
systemctl enable mysql.server

你可能感兴趣的:(源码编译安装Mysql-5.7.21 for Centos 7.x Linux)