当前位置: 首页 > news >正文

liunx7下centos6.8编译安装mysql-5.7.18

一,准备工作

如果cmake已经首先安装好,那么编译Mysql,先对当前目录.查看依赖关系 

cmake –graphviz

 

 

 

1,在当前环境下查看3306端口是否被防火墙开启:

firewall-cmd --query-post=3306/tcp

如果为no,则执行以下命令开启3306端口通过防火墙

firewall-cmd --permanent --add-post=3306/tcp

执行后显示success

然后重启防火墙

systemctl stop firewalld.service

systemctl start firewalld.service

再次查询3306端口是否开启:

firewall-cmd -query-post=3306/tcp

显示为yes

2,创建mysql运行的用户组和用户

groupadd -r mysql && useradd -r -g mysql -s /bin/false -M mysql

3,编译安装所需的依赖包

######CMake编译工具

cd /usr/local/src

wget https://cmake.org/files/v3.8/cmake-3.8.2.tar.gz  --可用最新版本

tar -zxf cmake-3.8.2.tar.gz

cd cmake-3.8.2.tar.gz

./configure --prefix=/usr/local/related/cmake

make && make install

######Ncurses:提供功能键定义(快捷键),屏幕绘制以及基于文本终端的图形互动功能的动态库

安装mysql 需要的为ncurses-devel

它只有rpm包所以只能安装rpm包或者使用yum安装 yum -y install ncurses-devel

这里演示下rpm安装,如若需要指定rpm的安装目录:

可以使用prefix参数。
rpm -i –prefix=/usr/bin abc.rpm将abc.rpm包安装到/usr/bin目录下。

但是这个ncurses-devel不支持指定目录,会报错:

警告:ncurses-devel-6.0-10.20170520.fc27.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f5282ee4: NOKEY
错误:软件包 ncurses-devel 不能重定位

所以只能默认安装

rpm -ivh ncurses-devel-6.0-10.20170520.fc27.x86_64.rpm

安装它需要N多依赖,所以还是yum吧

------------------------------------------------------------------------------------------------------------------------------------

下面的对于ncurses安装没用。

#cd /usr/local/src

#wget http://ftp.gnu.org/gnu/ncurses/ncurses-6.0.tar.gz --可用最新版本

#tar -zxf ncurses-6.0.tar.gz

#cd ncurses-6.0

#./configure --prefix=/usr/local/related/ncuress

#make && make install

#######bison:GNU分析器生成器

cd /usr/local/src

wget http://ftp.gnu.org/gnu/bison/bison-3.0.4.tar.gz

tar -zxf bison-3.0.4.tar.gz

cd bison-3.0.4

./configure --prefix=/usr/local/related/bison

make && make install

如果没有安装M4则会报:

GNU M4 1.4.6 or later is required; 1.4.16 or newer is recommended.

先编译安装GNU M4

cd /usr/local/src

wget ftp://ftp.gnu.org/gnu/m4/m4-1.4.6.tar.gz --可用最新版

tar -zxf m4-1.4.6.tar.gz

cd m4-1.4.6

./configure --prefix=/usr/local/related/m4

make && make install

然后需要将m4加入环境变量$PATH

vim /etc/profile

export PATH=“$PATH:/usr/local/related/m4/bin”

source /etc/profile

最后再次编译安装bison即可

make clean

./configure --prefix=/usr/local/related/bison

make && make install

3,在mysql5.7后编译安装需要boost的支持

#######Boost库:一个开源可移植的C++库,是C++标准化进程的开发引擎之一

cd /usr/local/src

wget https://sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz/download

tar -zxf boost_1_59_0.tar.gz -C /usr/local/related

只解压出即可,不用编译安装

因为ncurses和bison均没有使用yum安装,所以在编译mysql时必须指定ncurses的位置否则会报错:

Could NOT find Curses (missing: CURSES_LIBRARY CURSES_INCLUDE_PATH

Curses library not found. 

Please install appropriate package,

remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu, packagename is libncurses5-dev, on Redhat and derivates it isncurses-devel.

 

#必须解决他:

 

#用-D参数定义宏,指定头文件和库的所在目录
#即在编译mysql时cmke加上-DCURSES_LIBRARY=/usr/local/related/ncurses/lib/libncurses.a -DCURSES_INCLUDE_PATH=/usr/local/related/ncurses/include即可

解决这个问题后,对于bison也会报找不到的提示但是不影响编译进行,但是还是要解决,只需将bison的bin目录添加到环境变量即可。

vim /etc/profile

export PATH="$PATH:/usr/local/related/bison/bin"

最后开始编译mysql

cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DDEFAULT_CHARSET=utf8mb4 -DDEFAULT_COLLATION=utf8mb4_general_ci -DMYSQL_TCP_PORT=3306 -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1  -DWITH_DEBUG=0 -DWITH_ZLIB=/usr/local/related/zlib-1.2.11/ -DMYSQL_MAINTAINER_MODE=0 -DENABLE_DOWNLOADS=0 -DWITH_BOOST=/usr/local/related/boost_1_67_0/  -DWITH_SSL=yes  -DOPENSSL_ROOT_DIR=/usr/local/related/openssl-1.0.2p/ -DENABLED_LOCAL_INFILE=1 -DEXTRA_CHARSETS=all -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock

如果报错 Please set them or make sure they are set and tested correctly in the CMake files: ZLIB_LIBRARY

加入:

-DZLIB_LIBRARY=/usr/local/related/zlib-1.2.3/lib/zlib.a
-ZLIB_INCLUDE_DIR=/usr/local/related/zlib-1.2.3/lib/include

 

如果编译失败记得删除掉源码包目录里面的CMakeCache.txt文件后重新进行编译。

编译完毕后执行make && make install 即可。

编译安装时间较长,因为我们指定编译参数得时候,指定了mysql得数据存储的目录,这个时候可以先把目录都创建出来:

mkdir /usr/local/mysql
mkdir /usr/local/mysql/data
mkdir /usr/local/mysql/logs
mkdir /usr/local/mysql/pids

创建完毕后将目录的所有者变更为mysql

chown -R mysql:mysql /usr/local/mysql   -R为递归的将目录下的文件夹和文件统一设定

当make install 完成后需配置/etc/my.cnf文件,最终如下:

 

[client]
port    = 3306
socket    = /usr/local/mysql/mysql.sock

[mysqld]
user = mysql
#bind-address = 10.0.1.108
port  = 3306
pid-file = /usr/local/mysql/pids/mysqld.pid
socket  = /usr/local/mysql/mysql.sock
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
#tmpdir  = /usr/local/mysql/tmp

#skip-grant-tables
#rpl_semi_sync_master_enabled=1
#rpl_semi_sync_master_timeout=1000
#rpl_semi_sync_slave_enabled=1

sql_mode        = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

# Log
#general-log = 1
#general_log_file = /mysqllog/bitvclog/3306/mysql.log

slow-query-log = 1
slow-query-log-file = /usr/local/mysql/logs/slow.log
log-slow-admin-statements
log-slow-slave-statements
long-query-time = 1
log-error = /usr/local/mysql/logs/mysqld.log
#log-warnings  = 2  #mysql8 not used

back_log = 512
max_connections = 2048
max_connect_errors = 10000
connect_timeout = 60

skip-external-locking
skip-name-resolve
#skip-grant-tables
#skip-symbolic-links
#skip-innodb_checksums
#skip-innodb_doublewrite
explicit_defaults_for_timestamp

key_buffer_size = 16M
max_allowed_packet = 32M
table_open_cache = 512
sort_buffer_size = 8M
read_buffer_size = 4M
read_rnd_buffer_size = 32M
myisam_sort_buffer_size = 1M
thread_cache_size = 32

#query_cache_size = 128M       # 8.0 not used
#query_cache_type = 0           #  see up
server-id = 1
log-bin                 = mysql-bin
binlog_format           = mixed
sync_binlog             = 1

#expire-logs-days        = 7 #use binlog_expire_logs_seconds instedmax_binlog_size         = 256M
sync_binlog                     = 30

default-storage-engine = InnoDB
innodb_max_dirty_pages_pct = 90
innodb_file_per_table = 1
innodb_io_capacity = 100000
character-set-server = utf8
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50

[mysqldump]
quick
max_allowed_packet = 32M

[mysql]
no-auto-rehash
#safe-updates

[myisamchk]
key_buffer_size = 128M
sort_buffer_size = 128M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout

 

 

 

主要是修改了数据存放目录,日志文件目录,socket目录等路径信息与前面所建目录一致。

如果不想使用默认加载顺序中的配置文件,可以在启动命令上增加 --defaults-file='path/to/my.cnf'来指定要使用的配置文件,但在我这里一直改动默认my.cnf的位置不成功,可能版本问题。所以还是放在了/etc/下面

 

4.性能调优
由于编译的时间是在太长了,这个地方的性能调优不涉及任何的sql优化,只针对一点:使用jemalloc来替换默认的内存管理
首先我们需要从网站上下载jemalloc,官网地址:
http://www.canonware.com/jemalloc/

从github上可以下载最新的源码:
https://github.com/jemalloc/jemalloc/releases

编译jemalloc:

./configure --libdir=/usr/local/lib
make
make install

为了保证能够找到jemalloc库,我们需要设置一下库路径,

echo "/usr/local/lib" > /etc/ld.so.conf.d/usr_local_lib.conf
ldconfig //执行这个命令可以刷新库路径

我们有两种方式来使用jemalloc来优化mysql
在编译的时候加入参数:

-DCMAKE_EXE_LINKER_FLAGS="-ljemalloc" -DWITH_SAFEMALLOC=OFF

然后重新编译一遍。
也可以修改 /usr/local/mysql/bin/mysqld_safe
在# executing mysqld_safe 下面加上

LD_PRELOAD=/usr/local/lib/libjemalloc.so

5.开机自启动的配置
通常我们需要重启服务器,最好在重启服务器的时候就启动mysql

首先将安装目录中的(注意是安装目录并非源码包目录)suppost-files/mysql.server 复制为/etc/init.d/mysqld

然后给予执行权限chmod a+x /etc/init.d/mysqld

加入系统服务 chkconfig --add mysqld

设置开机自启动 chkconfig mysqld on

6,将mysql服务加入系统环境变量 /etc/profile

vim /etc/profile

注意除了bin目录外还有lib目录也需要加入到环境变量

 

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

 

然后执行 source /etc/profile 来更新环境变量使其生效

7,随后我们也需要对数据库进行初始化操作。自 mysql5.7 开始,初始化系统表不再使用 mysql_install_db 工具, 而是使用 mysqld –initialize-insecure –user=mysql , 其中 –initialize 表示默认生成一个安全的密码, –initialize-insecure 表示不生成密码, 密码为空,注意这只是初始化而已,并不会启动mysqld

 

mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

如果报错:

/usr/lib64 与 /usr/local/lib64都加入软链

[root@e2c745b5dd4a share]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
mysqld: error while loading shared libraries: libcrypto.so.1.0.0: cannot open shared object file: No such file or directory
[root@e2c745b5dd4a share]# find / -name libcrypto.so.1.0.0
/usr/local/related/openssl-1.0.2p/lib/libcrypto.so.1.0.0
[root@e2c745b5dd4a share]# ln -s /usr/local/related/openssl-1.0.2p/lib/libcrypto.so.1.0.0 /usr/local/lib64/
[root@e2c745b5dd4a share]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
mysqld: error while loading shared libraries: libcrypto.so.1.0.0: cannot open shared object file: No such file or directory
[root@e2c745b5dd4a share]# ln -s /usr/local/related/openssl-1.0.2p/lib/libcrypto.so.1.0.0 /usr/lib64/

 

执行命令后可能会出现几个warnning:

2017-07-17T03:36:18.954218Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2017-07-17T03:36:22.391313Z 0 [Warning] InnoDB: New log files created, LSN=45790
2017-07-17T03:36:22.847155Z 0 [Warning] InnoDB: Creating foreign key constraint system tables.
2017-07-17T03:36:23.109030Z 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: 1add7612-6aa1-11e7-8eb1-000c291881a9.
2017-07-17T03:36:23.112328Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2017-07-17T03:36:23.115175Z 1 [Warning] root@localhost is created with an empty password ! Please consider switching off the --initialize-insecure option.

关闭第一个是说

从 5.6开始,timestamp 的默认行为已经是 deprecated 了。

在MySQL 5.6.6之前,TIMESTAMP的默认行为:

•TIMESTAMP列如果没有明确声明NULL属性,默认为NOT NULL。(而其他数据类型,如果没有显示声明为NOT NULL,则允许NULL值。)设置TIMESTAMP的列值为NULL,会自动存储为当前timestamp。
•表中的第一个TIMESTAMP列,如果没有声明NULL属性、DEFAULT或者 ON UPDATE,会自动分配 DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP 属性。
•表中第二个TIMESTAMP列,如果没有声明为NULL或者DEFAULT子句,默认自动分配'0000-00-00 00:00:00′。插入行时没有指明改列的值,该列默认分配'0000-00-00 00:00:00′,且没有警告。

重启MySQL后错误消失,这时TIMESTAMP的行为如下:

•TIMESTAMP如果没有显示声明NOT NULL,是允许NULL值的,可以直接设置改列为NULL,而没有默认填充行为。
•TIMESTAMP不会默认分配DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP属性。
•声明为NOT NULL且没有默认子句的TIMESTAMP列是没有默认值的。往数据表中插入列,又没有给TIMESTAMP列赋值时,如果是严格SQL模式,会抛出一 个错误,如果严格SQL模式没有启用,该列会赋值为'0000-00-00 00:00:00′,同时出现一个警告。(这和MySQL处理其他时间类型数据一样,如DATETIME)
(参见:http://www.jb51.net/article/71054.htm)

也就是 explicit_defaults_for_timestamp 关闭了 timestamp 类型字段锁拥有的一些会让人感到奇怪的默认行为,加入了该参数之后,如果还需要为 timestamp类型的字段指定默认行为,那么就需要显示的在创建表时显示的指定。explicit_defaults_for_timestamp 也就是这个意思:显示指定默认值为timestamp类型的字段。

要关闭这个警告需要修改/etc/my.cnf

 

mysqld

explicit_defaults_for_timestamp=true

其余警告自己翻译下即可,没有影响。

如果不是第一次初始化会报错如下:


[root@localhost ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
2017-07-17T04:06:09.586245Z 0 [ERROR] --initialize specified but the data directory has files in it. Aborting.
2017-07-17T04:06:09.586290Z 0 [ERROR] Aborting
意思是说data 目录应该为空不应有文件,所以将data下的文件删除即可。
初始化之后开启mysqld服务端
/etc/init.d/mysqld start

最后我们将root密码修改一下:

 

 

 

mysql -u root
mysql> use mysql;
mysql>update user set authentication_string=password('123456') where user='root' and Host = 'localhost';
mysql> FLUSH PRIVILEGES;

 

最后特别提醒注意的一点是,新版的mysql数据库下的user表中已经没有Password字段了

而是将加密后的用户密码存储于authentication_string字段
8.tips
执行make命令的时候可以加-j(多进程)参数来加快编译速度
make -j “cpu 核数”

比如已知CPU是4核心的,可以使用:
make -j 4

-

如果启动时报Starting MySQL... ERROR! The server quit without updating PID file (/usr/local/mysql/pids/mysqld.pid).这个错误:

那么问题很大一部分是在My.cnf的配置中,看下mysqld.log日志错误。


 

相关文章:

  • 关于linux下查看磁盘,内容,CPU使用情况的命令
  • Linux系统IO分析工具之iotop参数详解(查看IO占用)
  • 正则表达式之完全体验
  • 安装libpng提示--configure: error: ZLib not installed
  • WINDOWS之端口和进程查看命令
  • 3种方法轻松处理php开发中emoji表情的问题
  • linux下升级openssl到新版本
  • linux7下centos6.8版本完全编译php7.17与nginx
  • linux7下centos6.8版本完全编译php7.17与nginx --后续,配置nginx.conf与php-fpm.conf,www.conf
  • jquery将serializeArray转为可用的json对象
  • PHP用户登录后跳转回上一访问页面的实现思路及代码
  • ckeditor 的简单调用
  • centos下的中文分词coreseek-4.1的编译安装与基本配置
  • linux下php支持sphinx的扩展安装
  • sphinx增量索引和主索引来实现索引的实时更新
  • AngularJS指令开发(1)——参数详解
  • Netty源码解析1-Buffer
  • Python 反序列化安全问题(二)
  • UMLCHINA 首席专家潘加宇鼎力推荐
  • 从setTimeout-setInterval看JS线程
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 服务器之间,相同帐号,实现免密钥登录
  • 复杂数据处理
  • 每天一个设计模式之命令模式
  • 如何胜任知名企业的商业数据分析师?
  • 使用 Node.js 的 nodemailer 模块发送邮件(支持 QQ、163 等、支持附件)
  • #android不同版本废弃api,新api。
  • #QT(串口助手-界面)
  • (007)XHTML文档之标题——h1~h6
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (二)PySpark3:SparkSQL编程
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET Micro Framework初体验(二)
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项
  • .net和php怎么连接,php和apache之间如何连接
  • .Net语言中的StringBuilder:入门到精通
  • []AT 指令 收发短信和GPRS上网 SIM508/548
  • [20171113]修改表结构删除列相关问题4.txt
  • [ACM] hdu 1201 18岁生日
  • [AI]文心一言爆火的同时,ChatGPT带来了这么多的开源项目你了解吗
  • [C/C++] -- 二叉树
  • [C++][数据结构][算法]单链式结构的深拷贝
  • [codeforces]Recover the String
  • [IE9] GPU硬件加速到底是实用创新还是噱头
  • [iOS]-UIKit