源码编译安装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=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=<directory>

  This CMake script will look for boost in <directory>.  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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容