CentOS7上源码编译安装MySQL5.7

来自linux中国网wiki
跳到导航 跳到搜索

注意

注意 cmake 选项应该再优化一下、 https://blog.csdn.net/kangshuo2471781030/article/details/79294503

有空要多看一下my.cnf 的各个参数 MySql5.7 配置文件 my.cnf 设置

pre


注意 cmake 选项应该再优化一下、
https://blog.csdn.net/kangshuo2471781030/article/details/79294503

MySQL currently requires boost_1_59_0

把原码包mysql-5.7.18.tar.gz上传到SOURCES目录下,并在SPECS目录下添加配置好的mysql.spec文件:

由于在Mysql5.6后都要依赖boost_1_59_0.tar.gz包,所以这里我直接解压到BUILD目录下,不然检测不到;

    tar xf boost_1_59_0.tar.gz -C rpmbuild/BUILD/ 
    
    -DWITH_MYISAM_STORAGE_ENGINE=ON
    -DENABLED_LOCAL_INFILE:BOOL=ON
    -DWITH_PARTITION_STORAGE_ENGINE:BOOL=ON 
  
    
    -DEXTRA_CHARSETS=all 我没有 

 rpmdevtools pcre-devel gcc make ncurses-devel

mysql5.7 源码编译安装

安装依赖包

yum -y install gcc gcc-c++ ncurses ncurses-devel cmake bison bison-devel rpmdevtools pcre-devel make 

下载相应源码包

wget http://downloads.sourceforge.net/project/boost/boost/1.59.0/boost_1_59_0.tar.gz
wget http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.18.tar.gz

创建mysql用户、用户组及目录

if ! id mysql > /dev/null 2>&1;then
useradd -M -s /sbin/nologin mysql
mkdir -p  /data/apps/mysql/data/
mkdir -p  /data/apps/mysql/binlog/
#mkdir -p  /data/apps/mysql/logs/
mkdir -p  /data/logs/mysql
touch /data/logs/mysql/mysqld-error.log
chown -R mysql:mysql /data/logs/mysql
chown -R mysql:mysql /data/apps/mysql


预编译及安装

tar zxvf boost_1_59_0.tar.gz -C /root/mysql #将文件解压至/root/mysql目录下
tar zxvf mysql-5.7.23.tar.gz && cd mysql-5.7.23
 file  ../boost_1_59_0
 
cmake .                                                  \
  -DSYSCONFDIR:PATH=/data/apps/mysql                            \
  -DCMAKE_INSTALL_PREFIX:PATH=/data/apps/mysql                 \
  -DCMAKE_BUILD_TYPE:STRING=Release                      \
  -DENABLE_PROFILING:BOOL=ON                             \
  -DWITH_DEBUG:BOOL=OFF                                  \
  -DWITH_VALGRIND:BOOL=OFF                               \
  -DENABLE_DEBUG_SYNC:BOOL=OFF                           \
  -DWITH_EXTRA_CHARSETS:STRING=all                       \
  -DWITH_SSL:STRING=bundled                              \
  -DWITH_UNIT_TESTS:BOOL=OFF                             \
  -DWITH_ZLIB:STRING=bundled                             \
  -DWITH_PARTITION_STORAGE_ENGINE:BOOL=ON                \
  -DWITH_INNOBASE_STORAGE_ENGINE=1                       \
  -DWITH_ARCHIVE_STORAGE_ENGINE:BOOL=ON                  \
  -DWITH_BLACKHOLE_STORAGE_ENGINE:BOOL=ON                \
  -DWITH_PERFSCHEMA_STORAGE_ENGINE:BOOL=ON               \
  -DDEFAULT_CHARSET=utf8                                 \
  -DDEFAULT_COLLATION=utf8_general_ci                    \
  -DENABLED_LOCAL_INFILE:BOOL=ON                         \
  -DINSTALL_LAYOUT:STRING=STANDALONE                     \
  -DCOMMUNITY_BUILD:BOOL=ON                              \
  -DWITHOUT_EXAMPLE_STORAGE_ENGINE=1                     \
  -DWITHOUT_NDBCLUSTER_STORAGE_ENGINE=1                  \
  -DENABLED_PROFILING=1                                  \
  -DINNODB_PAGE_ATOMIC_REF_COUNT=1                       \
  -DMYSQL_DATADIR=/data/apps/mysql/data                  \
  -DWITH_BOOST=../boost_1_59_0                           \
  -DSYSCONFDIR=/etc                                      \
  -DMYSQL_UNIX_ADDR=/tmp/mysql.sock                      \
  -DWITH_MEMORY_STORAGE_ENGINE=1                          \
  -DWITH_MYISAM_STORAGE_ENGINE=ON                         \
  -DWITH_READLINE=1                                      \
  -DWITH_SYSTEMD=1          \
  -DMYSQL_TCP_PORT=3306;

warring 
CMake Warning:
  Manually-specified variables were not used by the project:
    COMMUNITY_BUILD
    ENABLE_DEBUG_SYNC
    ENABLE_PROFILING
    INNODB_PAGE_ATOMIC_REF_COUNT
    WITH_MEMORY_STORAGE_ENGINE
    WITH_READLINE


#编译安装
make -j `grep processor /proc/cpuinfo | wc -l`  && make install 
#安装完成后清理一下零时文件
make clean

设置权限并初始化 MySQL 系统授权表

cd /data/apps/mysql/ 
useradd -M -s /sbin/nologin %{MYSQL_USER}
mkdir -p  /data/apps/mysql/data/
mkdir -p  /data/apps/mysql/binlog/
#mkdir -p  /data/apps/mysql/logs/
mkdir -p  /data/logs/mysql
touch /data/logs/mysql/mysqld-error.log
chown -R mysql:mysql /data/logs/mysql
chown -R mysql:mysql /data/apps/mysql

cd /data/apps/mysql/  
chown -R mysql:mysql .    
[root@szlinux02 mysql]# mkdir temp    
[root@szlinux02 mysql]# chmod 777 ./temp    
[root@szlinux02 mysql]# cd /data/mysql    
[root@szlinux02 mysql]# chown -R mysql:mysql . 

初始化系统数据库

MySQL 5.7.6之前的版本执行这个脚本初始化系统数据库

 ./bin/mysql_install_db --user=mysql --basedir=/data/apps/mysql --datadir=/data/mysql


5.7.6之后版本初始系统数据库脚本

 /data/apps/mysql/bin/mysqld --initialize-insecure  --user=mysql --basedir=/data/apps/mysql/ --datadir=/data/apps/mysql/data/

这个有问题呢 cd /data/apps/mysql/ ./bin/mysqld --initialize-insecure --user=mysql --basedir=/data/apps/mysql --datadir=/data/apps/mysql/data/

created with an empty password

注意: MySQL之前版本mysql_install_db是在mysql_basedir/script下,MySQL 5.7直接放在了mysql_basedir/bin目录下。 "--initialize"已废弃,生成一个随机密码(~/.mysql_secret) "--initialize-insecure"不会生成密码 "--datadir"目录下不能有数据文件

配置MySQL服务

#on centos6
cp  /data/apps/mysql/support-files/mysql.server  /etc/init.d/mysqld 
 chkconfig --add mysqld    
 chkconfig mysqld on

#on centos7 
 cp  scripts/systemd/mysqld.service.in     /usr/lib/systemd/system



systemctl status mysqld.service

cat > /etc/my.cnf << EOF
[client]    
port=3306    
socket		= /tmp/mysql.sock
  
[mysqld]    
character-set-server=utf8    
collation-server=utf8_general_ci

skip-external-locking   
skip-name-resolve

user=mysql   
port=3306    
basedir=/data/apps/mysql    
datadir=/data/apps/mysql/data   
#tmpdir=/usr/local/mysql/temp    
# server_id = .....    
socket=/tmp/mysql.sock   
log-error=/data/logs/mysql/mysqld-error.log  
pid-file=/data/apps/mysql/data/mysql.pid   
open_files_limit=10240    
back_log=600    
max_connections=500    
max_connect_errors=6000    
wait_timeout=605800    
#open_tables=600    
#table_cache = 650    
#opened_tables = 630

max_allowed_packet=32M   
sort_buffer_size=4M    
join_buffer_size=4M    
thread_cache_size=300    
query_cache_type=1    
query_cache_size=256M    
query_cache_limit=2M    
query_cache_min_res_unit=16k

tmp_table_size=256M   
max_heap_table_size=256M

key_buffer_size=256M   
read_buffer_size=1M    
read_rnd_buffer_size=16M    
bulk_insert_buffer_size=64M

lower_case_table_names=1

default-storage-engine=INNODB

innodb_buffer_pool_size=2G   
innodb_log_buffer_size=32M    
innodb_log_file_size=128M    
innodb_flush_method=O_DIRECT    
#####################    
thread_concurrency=32    
long_query_time=2    
slow-query-log=on    
slow_query_log_file = /data/logs/mysql/slow-mysql.log


[mysqldump]   
quick    
max_allowed_packet=32M

#[mysqld_safe]   
#log-error=/var/log/mysqld.log    
#pid-file=/var/run/mysqld/mysqld.pid    
EOF



启动关闭 mysql 数据库

关闭和启动的最直接就是他们了,启动脚本也是启用他们的


关闭mysql 数据库
mysqladmin --defaults-file=/etc/my.cnf -uroot -p'xx'  shutdown   2>&1
killall -15 mysqld


启动
mysqld_safe my.cnf

#启动脚本启动 其实就是启用上面的命令 面试遇到
 service mysqld start

配置MySQL环境变量

echo -e '\n\nexport PATH=/usr/local/mysql/bin:$PATH\n' >> /etc/profile && source /etc/profile


设置数据库root用户密码

./bin/mysql_secure_installation


创建其他MySQL数据库用户

[root@szlinux02 mysql]# mysql -uroot -p   
mysql> CREATE DATABASE `testdb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;    
mysql> grant all privileges on testdb.* to 'ryanxu'@'%' identified by 'ABCabc123!@#';    
mysql> flush privileges;    
myqsl> exit


3.启动时没有使用配置文件 如果没有设置使用指定目录my.cnf文件及默认读取目录没有my.cnf文件,表示mysql启动时并没有加载配置文件,而是使用默认配置。

需要修改配置,可以在mysql默认读取的目录中,创建一个my.cnf文件(例如:/etc/my.cnf),把需要修改的配置内容写入,重启mysql后即可生效。

mysqld --verbose --help | grep -A 'Default options'

注意

my.cnf配置文件
官网说:从5.7.18开始不在二进制包中提供my-default.cnf文件,不再需要my.cnf。从源码编译安装的mysql,基本配置在预编译和systemd启动文件中已定义好,不用my.cnf配置。

编辑systemd启动文件  可以直接拿过来用 在rpmbuild要怎么处理好呢
mysql 5.7 默认将 mysqld.service (/usr/local/mysql/)文件安装到了 mysql 安装目录下的 usr/lib/systemd/system/,将 mysqld.service 复制到/usr/lib/systemd/system/目录下

[root@localhost]/usr/local/mysql#cp usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system

cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service  /usr/lib/systemd/system

cd ~/mysql-5.7.20
cp ./scripts/mysqld.service /usr/lib/systemd/system
vi /usr/lib/systemd/system/mysqld.service
配置文件无需改动

启动mysql
systemctl enable mysqld.service
systemctl daemon-reload
systemctl start mysqld.service
systemctl status mysqld.service

CentOS7编译安装MySQL 5.7.20

https://dev.mysql.com/doc/refman/5.7/en/using-systemd.html

查看MySQL Innodb引擎当前参数

mysql>show variables like '%innodb%';
mysql>SHOW engine innodb STATUS\G;

other

mysql中utf8和utf8mb4区别 MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode。好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。当然,为了节省空间,一般情况下使用utf8也就够了。

  二、内容描述
  那上面说了既然utf8能够存下大部分中文汉字,那为什么还要使用utf8mb4呢? 原来mysql支持的 utf8 编码最大字符长度为 3 字节,如果遇到 4 字节的宽字符就会插入异常了。三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xffff,也就是 Unicode 中的基本多文种平面(BMP)。也就是说,任何不在基本多文本平面的 Unicode字符,都无法使用 Mysql 的 utf8 字符集存储。包括 Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和很多不常用的汉字,以及任何新增的 Unicode 字符等等。

mysql中utf8和utf8mb4区别

trouble shooting

#如果改为自己的配置文件就有问题  
[root@rpmbuild mysql]# cp /etc/my.cnf.rpmold   /etc/my.cnf 
[root@rpmbuild mysql]# service mysqld restart 
Shutting down MySQL.. SUCCESS! 
Starting MySQL. ERROR! The server quit without updating PID file (/data/apps/mysql/data/rpmbuild.pid).

原来是初始系统数据库有问题,应该是格式问题   根本在 数据目录没生成 sys 相关目录,我手工 先mysqld --initialize-insecure 再mysqld --initialize-insecure  --user=mysql --basedir=/data/apps/mysql/,最后如下 居然成功了
/data/apps/mysql/bin/mysqld --initialize-insecure  --user=mysql --basedir=/data/apps/mysql/ --datadir=/data/apps/mysql/data/


加上-DWITH_SYSTEMD=1可以使用systemd控制mysql服务,默认是不开启systemd的
mysql 5.7 默认将 mysqld.service (/usr/local/mysql/)文件安装到了 mysql 安装目录下的 usr/lib/systemd/system/,将 mysqld.service 复制到/usr/lib/systemd/system/目录下

cp usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system

#没开启systemd的原因 
rpm -ivh ops_mysql-5.7.18-1.0.x86_64.rpm 
准备中...                          ################################# [100%]
正在升级/安装...
   1:ops_mysql-5.7.18-1.0             ################################# [100%]
cp: 无法获取"/data/apps/mysql/usr/lib/systemd/system/mysqld.service" 的文件状态(stat): 没有那个文件或目录
Failed to execute operation: No such file or directory
Failed to start mysqld.service: Unit not found.
chmod: 无法访问"/etc/rc.d/init.d/mysqld": 没有那个文件或目录
/var/tmp/rpm-tmp.4yo85p:行25: /etc/init.d/mysqld: 没有那个文件或目录
mysqladmin: connect to server at 'localhost' failed
error: 'Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)'
Check that mysqld is running and that the socket: '/tmp/mysql.sock' exists!
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 2002 (HY000): Can't connect to local MySQL server through socket 


sysd 启动 mysql err log 如下
[ERROR] /usr/sbin/mysqld: Can't create/write to file '/var/run/mysqld/mysqld.pid' (Errcode: 13 - Permission denied) 
把启动文件pid目录必一下就行了
sed -i 's!/var/run/mysqld/mysqld.pid!/data/apps/mysql/data/mysqld.pid!'   mysqld.service


mysql重启出错:mysqld unknown variable explicit_defaults_for_timestamp=true

see also

Mysql性能优化


Centos7.2编译安装mysql5.7.18配置及详解

Centos7.2 Systemd 方式编译 Mysql5.7.11

Centos7下源码安装Mysql5.7

CentOS 7.4 使用源码包编译安装MySQL 5.7.20

mysql 查看当前使用的配置文件my.cnf的方法

CentOS-7 下 systemctl 管理 mysql-5.7的不同,配置jemalloc


查看MySQL配置文件路径及相关配置

http://blog.51cto.com/ultrasql/1924467

fedora 也是用的 mariadb 10.2 的版本

CentOS 7下MySQL服务启动失败的解决思路

配置文件相关

mysql5.7新增参数配置解释


mysql数据库参数innodb_buffer_pool_size和max_connections

MySql5.7 配置文件 my.cnf 设置

MySQL5.7优化配置参数

mysql的auto-rehash简介

MySQL数据库 prompt参数详解


MySQL 5.7中explicit_defaults_for_timestamp参数


MySql系统变量explicit_defaults_for_timestamp

mysql5.5、5.6打包rpm