- 一.前言
- 二.关于MySQL
- 三.MySQL安装篇
- 3.1 部署环境
- 3.2 前期准备工具
- 3.3 挂载系统ISO镜像,配置yum源
- 3.4 安装mysql编译所需的依赖包
- 3.5 源码编译安装mysql5.7
- 3.6 配置mysql
- 四.MySQL调优篇
- 4.1 对MySQL进行安全设置
- 4.2 设置MySQL超时时间
- 4.3 MySQL配置文件优化参考1(按需配置即可)
- 4.4 MySQL配置文件优化参考2(按需配置即可)
- 五.参考资料
一.前言
根据安全性和保密性的要求,内网服务器是不能访问网络的,所以只能离线安装软件,安装MySQL的依赖包需要配置yum源,由于服务器架构的不同,考虑到兼容性,可定制性,以及为了提高MySQL运行性能,编译安装MySQL是最合适的方法。
二.关于MySQL
MySQL是最流行的关系型数据库管理系统之一,使用简单,部署快速,功能全面,可以快速满足中小型公司的数据存储需求。
三.MySQL安装篇
3.1 部署环境
服务器版本 | MySQL软件版本 | CPU架构 |
---|---|---|
CentOS Linux release 7.4.1708 (Core) | MySQL 5.7 | x86_64 |
3.2 前期准备工具
- CentOS-7-x86_64-DVD-1708.iso #下载地址: http://mirror.unpad.ac.id/centos/7.4.1708/isos/x86_64/
- gcc-7.3.0.tar.gz #下载地址:https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-7.3.0/
- gmp-6.1.0.tar.bz2 #下载地址:https://gcc.gnu.org/pub/gcc/infrastructure/
- mpfr-3.1.4.tar.bz2 #下载地址:https://gcc.gnu.org/pub/gcc/infrastructure/
- mpc-1.0.3.tar.gz #下载地址:https://gcc.gnu.org/pub/gcc/infrastructure/
- isl-0.16.1.tar.bz2 #下载地址:https://gcc.gnu.org/pub/gcc/infrastructure/
- mysql-boost-5.7.22.tar.gz #下载地址为 https://dev.mysql.com/downloads/mysql/5.7.html#downloads
3.3 挂载系统ISO镜像,配置yum源
由于内网无法访问网络,所以需先挂载centos7的ISO镜像,然后配置yum源安装mysql5.7编译所需要的依赖包
创建ISO镜像存放目录并上传ISO镜像文件
[root@node8 ~]# mkdir /mnt/yum-iso
[root@node8 ~]# cd /mnt/
[root@node8 mnt]# cd yum-iso/
[root@node8 yum-iso]# mkdir /mnt/cdrom
[root@node8 yum-iso]# pwd
/mnt/yum-iso
使用xftp工具上传ISO镜像到/mnt/yum-iso目录
挂载ISO镜像到/mnt/cdrom目录
[root@node8 yum-iso]# mount -o loop /mnt/yum-iso/CentOS-7-x86_64-DVD-1708.iso /mnt/cdrom #挂载系统镜像
mount: /dev/loop0 is write-protected, mounting read-only
[root@node8 yum-iso]# df -h #查看磁盘
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 17G 13G 4.3G 76% /
devtmpfs 478M 0 478M 0% /dev
tmpfs 489M 0 489M 0% /dev/shm
tmpfs 489M 6.7M 482M 2% /run
tmpfs 489M 0 489M 0% /sys/fs/cgroup
/dev/sda1 1014M 125M 890M 13% /boot
tmpfs 98M 0 98M 0% /run/user/0
/dev/loop0 4.3G 4.3G 0 100% /mnt/cdrom #显示这一行说明已经镜像已经挂载成功
配置yum源:
[root@node8 yum-iso]# cd /etc/yum.repos.d/
[root@node8 yum.repos.d]# mkdir yumbak
[root@node8 yum.repos.d]# mv *.repo yumbak/ #备份原有配置文件
[root@node8 yum.repos.d]# vim iso.repo
[root@node8 yum.repos.d]# cat iso.repo
[centos7-iso]
name=centos-iso
baseurl=file:///mnt/cdrom #此处写镜像挂载目录
gpgcheck=0
enabled=1
清空yum缓存:
[root@node8 yum.repos.d]# yum clean all
Loaded plugins: fastestmirror
Cleaning repos: centos7-iso
Cleaning up everything
Maybe you want: rm -rf /var/cache/yum, to also free up space taken by orphaned data from disabled or removed repos
Cleaning up list of fastest mirrors
[root@node8 yum.repos.d]#
使用yum list检查是否设置成功!如果有输出就表示yum源配置成功
[root@node9 yum.repos.d]# yum list
设置开机自动挂载iso镜像文件,在/etc/fstab的最后一行添加配置,将iso文件永久挂载到系统中
[root@node9 yum.repos.d]# vim /etc/fstab
[root@node9 yum.repos.d]# cat /etc/fstab
# /etc/fstab
# Created by anaconda on Fri Apr 26 17:36:34 2019
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
/dev/mapper/centos-root / xfs defaults 0 0
UUID=c7de6c01-e93f-4907-b919-5989396f857b /boot xfs defaults 0 0
/dev/mapper/centos-swap swap swap defaults 0 0
/mnt/yum-iso/CentOS-7-x86_64-DVD-1708.iso /mnt/cdrom iso9660 loop 0 0 #这行是新增的,注意这里要写正确,不然服务器开不了机
再次查看磁盘,确认系统镜像是否挂载成功
[root@node9 yum.repos.d]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 17G 7.5G 9.5G 45% /
devtmpfs 2.0G 0 2.0G 0% /dev
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 2.0G 8.6M 2.0G 1% /run
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/sda1 1014M 125M 890M 13% /boot
tmpfs 394M 0 394M 0% /run/user/0
/dev/loop0 4.3G 4.3G 0 100% /mnt/cdrom
3.4 安装mysql编译所需的依赖包
安装mysql基本依赖包依赖包
[root@node9 ~]# yum install bison* ncurses* -y
[root@node9 ~]# yum install -y bzip2 wget -y
升级gcc到7.3版本用于编译MySQL,编译安装gcc源码包安装gcc
[root@node9 yum.repos.d]# cd /home/
上传gcc-7.3.0.tar.gz到/home目录
[root@node9 home]# rz -E #rz命令上传gcc源码包
rz waiting to receive.
[root@node9 home]# ls
gcc-7.3.0.tar.gz
解压gcc源码包
[root@node9 home]# tar -xvf gcc-7.3.0.tar.gz #tar命令解压gcc
[root@node9 home]# pwd
/home
[root@node9 home]# ls
gcc-7.3.0 gcc-7.3.0.tar.gz
[root@node9 gcc-7.3.0]# cd gcc-7.3.0
[root@node9 gcc-7.3.0]# pwd
/home/gcc-7.3.0
上传gmp-6.1.0.tar.bz2,mpfr-3.1.4.tar.bz2,mpc-1.0.3.tar.gz,isl-0.16.1.tar.bz2到/home/gcc-7.3.0目录下
[root@node9 gcc-7.3.0]# rz -E
rz waiting to receive.
[root@node9 gcc-7.3.0]# rz -E
rz waiting to receive.
[root@node9 gcc-7.3.0]# rz -E
rz waiting to receive.
[root@node9 gcc-7.3.0]# rz -E
rz waiting to receive.
[root@node9 gcc-7.3.0]# ls
ABOUT-NLS COPYING3 isl-0.16.1.tar.bz2 libhsail-rt ltmain.sh mkinstalldirs
ChangeLog COPYING3.LIB LAST_UPDATED libiberty lt~obsolete.m4 move-if-change
ChangeLog.jit COPYING.LIB libada libitm lto-plugin mpc-1.0.3.tar.gz
ChangeLog.tree-ssa COPYING.RUNTIME libatomic libmpx ltoptions.m4 mpfr-3.1.4.tar.bz2
compile depcomp libbacktrace libobjc ltsugar.m4 NEWS
config fixincludes libcc1 liboffloadmic ltversion.m4 README
config.guess gcc libcilkrts libquadmath MAINTAINERS symlink-tree
config-ml.in gmp-6.1.0.tar.bz2 libcpp libsanitizer maintainer-scripts ylwrap
config.rpath gnattools libdecnumber libssp Makefile.def zlib
config.sub gotools libffi libstdc++-v3 Makefile.in
configure include libgcc libtool-ldflags Makefile.tpl
configure.ac INSTALL libgfortran libtool.m4 MD5SUMS
contrib install-sh libgo libvtv missing
COPYING intl libgomp ltgcc.m4 mkdep
在“gcc-7.3.0”目录下,检查gcc的依赖包是否已下载和安装,如果没有,会自动下载和安装。
[root@node9 gcc-7.3.0]# ./contrib/download_prerequisites
gmp-6.1.0.tar.bz2: OK
mpfr-3.1.4.tar.bz2: OK
mpc-1.0.3.tar.gz: OK
isl-0.16.1.tar.bz2: OK
All prerequisites downloaded successfully.#如果输出为这样,所以所以依赖都已满足
使用configure命令检查gcc编译环境
[root@node9 gcc-7.3.0]# cd /home/gcc-7.3.0
[root@node9 gcc-7.3.0]# mkdir gcc-build-7.3.0
[root@node9 gcc-7.3.0]# cd gcc-build-7.3.0
[root@node9 gcc-build-7.3.0]# ../configure --enable-checking=release --enable-language=c,c++ --disable-multilib --prefix=/usr #--prefix=/usr是把gcc指定安装在/usr目录下
.......
....输出内容过多,只列出如下...
checking where to find the target windmc... host tool
checking whether to enable maintainer-specific portions of Makefiles... no
configure: creating ./config.status
config.status: creating Makefile
[root@node9 gcc-build-7.3.0]# echo $? #输出结果为0则说明gcc编译环境满足条件
0
使用make -j 4编译gcc,4代表使用几个线程来执行程序,如果是16核服务器则可以使用16
[root@node9 gcc-build-7.3.0]# make -j 4
[root@node9 gcc-build-7.3.0]# echo $? ##输出结果为0则说明编译成功
0
使用make install安装gcc
[root@node9 gcc-build-7.3.0]# make install
[root@node9 gcc-build-7.3.0]# echo $? ##输出结果为0则说明安装成功
0
确定“libstdc++.so”是否在“/usr/lib64”目录下
[root@node9 gcc-build-7.3.0]# cd /usr/lib64/
[root@node9 lib64]# ll | grep libstdc++.so
lrwxrwxrwx 1 root root 19 Nov 5 12:34 libstdc++.so -> libstdc++.so.6.0.24
lrwxrwxrwx 1 root root 19 Nov 5 12:34 libstdc++.so.6 -> libstdc++.so.6.0.24
-rwxr-xr-x. 1 root root 991616 Mar 14 2019 libstdc++.so.6.0.19
-rwxr-xr-x 1 root root 11515840 Nov 5 12:34 libstdc++.so.6.0.24
-rw-r--r-- 1 root root 2385 Nov 5 12:34 libstdc++.so.6.0.24-gdb.py
确定软连接是否存在
[root@node9 lib64]# ll |grep libstdc++.so.6.0.24
lrwxrwxrwx 1 root root 19 Nov 5 12:34 libstdc++.so -> libstdc++.so.6.0.24
lrwxrwxrwx 1 root root 19 Nov 5 12:34 libstdc++.so.6 -> libstdc++.so.6.0.24
-rwxr-xr-x 1 root root 11515840 Nov 5 12:34 libstdc++.so.6.0.24
-rw-r--r-- 1 root root 2385 Nov 5 12:34 libstdc++.so.6.0.24-gdb.py
查看gcc版本
[root@node9 lib64]# gcc -v #输出如下内容则说明gcc 7.3安装成功
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-pc-linux-gnu/7.3.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../configure --enable-checking=release --enable-language=c,c++ --disable-multilib --prefix=/usr
Thread model: posix
gcc version 7.3.0 (GCC)
3.5 源码编译安装mysql5.7
上传mysql-boost-5.7.22.tar.gz到/usr/local/src/目录下
[root@node9 lib64]# cd /usr/local/src/
[root@node9 src]# pwd
/usr/local/src
[root@node9 src]# rz -E
rz waiting to receive.
[root@node9 src]# ls
mysql-boost-5.7.28.tar.gz
解压mysql源码包
[root@node9 src]# tar -zxf mysql-boost-5.7.28.tar.gz
[root@node9 src]# ls
mysql-5.7.28 mysql-boost-5.7.28.tar.gz
下载mysql补丁文件,并放置到/usr/local/src/mysql-5.7.28路径下(这步其实可以省略)
补丁下载路径:https://bugs.mysql.com/file.php?id=28180&bug_id=94699
[root@node9 src]# cd mysql-5.7.28/
[root@node9 mysql-5.7.28]# pwd
/usr/local/src/mysql-5.7.28
[root@node9 mysql-5.7.28]# rz -E
rz waiting to receive.
[root@node9 mysql-5.7.28]# ls
0001-Bug-94699-Mysql-deadlock-and-bugcheck-on-aarch64.patch
[root@node9 mysql-5.7.28]# pwd
/usr/local/src/mysql-5.7.28
打mysql补丁,如果没有patch命令则需要安装patch命令
[root@node9 mysql-5.7.28]# patch -p1 < 0001-Bug-94699-Mysql-deadlock-and-bugcheck-on-aarch64.patch
-bash: patch: command not found #出现这个提示说明patch没有安装
#安装patch命令
[root@node9 mysql-5.7.28]# yum -y install patch
...........................
.....输出太多只显示如下.......
Installed:
patch.x86_64 0:2.7.1-8.el7
Complete!
开始打补丁
#打补丁:全部回车即可
[root@node9 mysql-5.7.28]# patch -p1 < 0001-Bug-94699-Mysql-deadlock-and-bugcheck-on-aarch64.patch
patching file storage/innobase/sync/sync0rw.cc
Reversed (or previously applied) patch detected! Assume -R? [n]
Apply anyway? [n]
Skipping patch.
2 out of 2 hunks ignored -- saving rejects to file storage/innobase/sync/sync0rw.cc.rej
创建mysql的cmake脚本
[root@node9 mysql-5.7.28]# pwd
/usr/local/src/mysql-5.7.28
[root@node9 mysql-5.7.28]# vim cmake.sh #由于mysql的编译参数较多,写到脚本里便于运行以及复用
[root@node9 mysql-5.7.28]# cat cmake.sh
#CMAKE_INSTALL_PREFIX路径和WITH_BOOST路径按照您的真实路径填写
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DMYSQL_DATADIR=/data/data \
-DSYSCONFDIR=/etc \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_PARTITION_STORAGE_ENGINE=1 \
-DWITH_FEDERATED_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DENABLED_LOCAL_INFILE=1 \
-DENABLE_DTRACE=0 \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DWITH_EMBEDDED_SERVER=1 \
-DDOWNLOAD_BOOST=1 \
-DWITH_BOOST=/usr/local/src/mysql-5.7.28/boost/boost_1_59_0
给cmake.sh赋予可执行权限
[root@node9 mysql-5.7.28]# chmod +x cmake.sh
再次安装mysql依赖包
[root@node9 mysql-5.7.28]# yum -y install openssl openssl-devel expat-deve
执行脚本
[root@node9 mysql-5.7.28]# ./cmake.sh
[root@node9 mysql-5.7.28]# echo $? #输出为0则说明脚本执行成功
0
编译mysql
[root@node9 mysql-5.7.28]# make -j 5
[root@node9 mysql-5.7.28]# echo $? #输出为0则说明MySQL编译成功
0
安装mysql
[root@node9 mysql-5.7.28]# make install
[root@node9 mysql-5.7.28]# echo $? #输出为0则说明MySQL安装成功
0
3.6 配置mysql
删除系统残留的mysql用户和用户组,以免造成干扰
[root@node9 mysql-5.7.28]# userdel -r mysql #删除用户
userdel: mysql mail spool (/var/spool/mail/mysql) not found
userdel: mysql home directory (/home/mysql) not found
[root@node9 mysql-5.7.28]# groupdel mysql #删除用户组
groupdel: group 'mysql' does not exist
创建mysql用户和用户组
[root@node9 mysql-5.7.28]# groupadd mysql #创建MySQL用户组
[root@node9 mysql-5.7.28]# useradd -g mysql mysql #创建MySQL用户
修改/usr/local/mysql权限
[root@node9 mysql-5.7.28]# chown -R mysql:mysql /usr/local/mysql
进入安装路径,创建data、log、run文件夹,分别用户保存数据,日志,进程ID
[root@node9 mysql-5.7.28]# cd /usr/local/mysql/
[root@node9 mysql]# mkdir -p /data/log /data/data /data/run
进行mysql初始化
[root@node9 mysql]# bin/mysqld --initialize --basedir=/usr/local/mysql --datadir=/data/data --user=mysql #basedir填MySQL安装目录,datadir填数据存在目录,user填MySQL运行用户
2019-11-05T06:33:23.155541Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
2019-11-05T06:33:23.247376Z 0 [ERROR] Could not open file '/var/log/mysqld.log' for error logging: Permission denied #出现这个错误,说明/var/log/mysqld.log权限不足
2019-11-05T06:33:23.247427Z 0 [ERROR] Aborting
#赋予/var/log/mysqld.log的拥有者为mysql
[root@node9 mysql]# chown -R mysql:mysql /var/log/mysqld.log
#再次进行MySQL初始化
[root@node9 mysql]# bin/mysqld --initialize --basedir=/usr/local/mysql --datadir=/data/data --user=mysql
[root@node9 mysql]# echo $? #此输出为0则说明MySQL初始化成功
0
创建mysql.log和mysql.pid文件,并赋予mysql用户及用户组权限
[root@node9 mysql]# touch /data/log/mysql.log
[root@node9 mysql]# touch /data/run/mysql.pid
[root@node9 mysql]# chown -R mysql:mysql /data
编辑mysql配置文件(配置文件最好和我保持一致)
[root@node9 mysql]# vim /etc/my.cnf
[root@node9 mysql]# cat /etc/my.cnf
[mysqld]
basedir=/var/lib/mysql
datadir=/data/data #数据存放目录
port=3306 #端口号
socket=/data/data/mysql.sock
character-set-server=utf8 #字符集编码
symbolic-links=0
log-error=/data/log/mysql.log #日志存放目录
pid-file=/data/run/mysql.pid #MySQL进程ID存放目录
!includedir /etc/my.cnf.d
启动mysql
[root@node9 mysql]# pwd
/usr/local/mysql
[root@node9 mysql]# cp support-files/mysql.server /etc/init.d/mysql
[root@node9 mysql]# chkconfig mysql on #配置MySQL开机自启动
[root@node9 mysql]# service mysql start #启动MySQL
Starting MySQL SUCCESS! #如果出现此,则说明MySQL启动成功
添加mysql路径到当前用户的环境变量里,这样可以直接在shell中使用MySQL命令
[root@node9 mysql]# vim ~/.bash_profile
[root@node9 mysql]# cat ~/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
#export PATH
export PATH=/usr/local/mysql/bin:$PATH #新增
使环境变量生效并重启MySQL
[root@node9 mysql]# source ~/.bash_profile
[root@node9 mysql]# service mysql restart
ERROR! MySQL server PID file could not be found!
Starting MySQL. SUCCESS!
[root@node9 mysql]# ps -ef | grep mysql #查看MySQL进程是否存在
root 121678 1 0 14:55 pts/0 00:00:00 /bin/sh /var/lib/mysql/bin/mysqld_safe --datadir=/data/data --pid-file=/data/run/mysql.pid
mysql 121933 121678 1 14:55 pts/0 00:00:00 /var/lib/mysql/bin/mysqld --basedir=/var/lib/mysql --datadir=/data/data --plugin-dir=/var/lib/mysql/lib/plugin --user=mysql --log-error=/data/log/mysql.log --pid-file=/data/run/mysql.pid --socket=/data/data/mysql.sock --port=3306
root 121963 1325 0 14:55 pts/0 00:00:00 grep --color=auto mysql
进入mysql数据库
[root@node9 mysql]# mysql -uroot -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
#出现这种报错说明sock出错,方法为建立套接字软链接,接入MySQL环境
[root@node9 mysql]# ln -s /data/data/mysql.sock /tmp/mysql.sock
首先查询mysql默认密码:
[root@node9 ~]# grep 'temporary password' /var/log/mysqld.log
2019-11-05T06:35:28.565529Z 1 [Note] A temporary password is generated for root@localhost: T<&loC3=%t+Q
#T<&loC3=%t+Q就是mysql初始密码
#进入mysql数据库
[root@node9 mysql]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.7.26-log
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> SET PASSWORD = PASSWORD('123456');#修改mysql的root用户密码为123456
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> UPDATE mysql.user SET authentication_string =PASSWORD('123456') WHERE User='mysql';#修改mysql的mysql用户密码为123456
Query OK, 0 rows affected, 1 warning (0.00 sec)
Rows matched: 0 Changed: 0 Warnings: 1
mysql> GRANT ALL PRIVILEGES ON *.* TO mysql@localhost IDENTIFIED BY '123456' WITH GRANT OPTION;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON *.* TO mysql@"%" IDENTIFIED BY '123456' WITH GRANT OPTION;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> GRANT ALL PRIVILEGES ON *.* TO root@localhost IDENTIFIED BY '123456' WITH GRANT OPTION;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY '123456' WITH GRANT OPTION;
Query OK, 0 rows affected, 1 warning (0.01 sec)
mysql> FLUSH PRIVILEGES ; #刷新mysql权限
Query OK, 0 rows affected (0.00 sec)
mysql> exit #退出MySQL
Bye
再次进入mysql数据库,密码为修改后的密码123456
[root@node9 mysql]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.26-log Source distribution
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show databases; #展示MySQL数据库
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
自此,mysql5.7源码编译安装完成。
四.MySQL调优篇
4.1 对MySQL进行安全设置
[root@node9 ~]# mysql_secure_installation #此命令用于对MySQL进行安全设置
Securing the MySQL server deployment.
Enter password for user root: #键入root密码
VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD plugin?
Press y|Y for Yes, any other key for No: n #如果要安全MySQL密码强度插件,则y,安装之后简单的密码是设置不成功的
Using existing password for root.
Change the password for root ? ((Press y|Y for Yes, any other key for No) : n #是否更改root密码,修改则y
... skipping.
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.
Remove anonymous users? (Press y|Y for Yes, any other key for No) : y #是否移除匿名用户,建议移除
Success.
Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.
Disallow root login remotely? (Press y|Y for Yes, any other key for No) : y #是否禁止root用户远程登录,建议禁止,输入y
Success.
By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.
Remove test database and access to it? (Press y|Y for Yes, any other key for No) : y #是否移除test数据库,按个人需求选择即可
- Dropping test database...
Success.
- Removing privileges on test database...
Success.
Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.
Reload privilege tables now? (Press y|Y for Yes, any other key for No) : y #输入y,立即刷新权限表,使配置生效
Success.
All done!
4.2 设置MySQL超时时间
MySQL默认连续8小时内没有访问数据库的操作,就会断开数据库连接,mysql数据库拒绝访问,在某些场景下,8小时是不够的,需要把MySQL超时时间调大,此时就需要调节MySQL的wait_timeout和interactive_timeout参数
mysql> show variables like '%timeout%';#用于查看MySQL时间相关的参数
修改MySQL配置文件,使wait_timeout和interactive_timeout参数变为31536000
[root@node9 mysql]# vim /etc/my.cnf
[root@node9 mysql]# cat /etc/my.cnf
[mysqld]
basedir=/var/lib/mysql
datadir=/data/data #数据存放目录
port=3306 #端口号
socket=/data/data/mysql.sock
character-set-server=utf8 #字符集编码
symbolic-links=0
log-error=/data/log/mysql.log #日志存放目录
pid-file=/data/run/mysql.pid #MySQL进程ID存放目录
wait_timeout=31536000 #此为新增,配置MySQL超时时间,默认8小时,针对非交互式场景(jdbc,pymysql类似)
interactive_timeout=31536000 #此为新增,配置MySQL超时时间, 默认8小时,针对交互式场景(手动执行,mysqldump)
!includedir /etc/my.cnf.d
MySQL配置文件修改后,重启MySQL使配置文件生效
[root@node9 ~]# service mysql restart
Shutting down MySQL. SUCCESS!
Starting MySQL. SUCCESS!
进入MySQL,查看MySQL超时时间是否修改成功
[root@node9 ~]# mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.26-log Source distribution
Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> show variables like '%timeout%';
+-----------------------------+----------+
| Variable_name | Value |
+-----------------------------+----------+
| connect_timeout | 10 |
| delayed_insert_timeout | 300 |
| have_statement_timeout | YES |
| innodb_flush_log_at_timeout | 1 |
| innodb_lock_wait_timeout | 50 |
| innodb_rollback_on_timeout | OFF |
| interactive_timeout | 31536000 | #interactive_timeout已经变了
| lock_wait_timeout | 31536000 |
| net_read_timeout | 30 |
| net_write_timeout | 60 |
| rpl_stop_slave_timeout | 31536000 |
| slave_net_timeout | 60 |
| wait_timeout | 31536000 | #wait_timeout已经变了
+-----------------------------+----------+
13 rows in set (0.01 sec)
4.3 MySQL配置文件优化参考1(按需配置即可)
[root@node9 mysql]# vim /etc/my.cnf
[root@node9 mysql]# cat /etc/my.cnf
[mysqld]
symbolic-links=0
log-error=/data/log/mysql.log #日志存放目录
wait_timeout=31536000 #此为新增,配置MySQL超时时间,默认8小时,针对非交互式场景(jdbc,pymysql类似)
interactive_timeout=31536000 #此为新增,配置MySQL超时时间, 默认8小时,针对交互式场景(手动执行,mysqldump)
!includedir /etc/my.cnf.d
[client] #客户端设置,即客户端默认的连接参数
port = 3306 #默认连接端口
socket=/data/data/mysql.sock #用于本地连接的socket套接字
default-character-set = utf8mb4 #字符编码编码,utf8mb4编码是utf8编码的超集,兼容utf8,并且能存储4字节的表情字符。采用utf8mb4编码的好处是:存储与获取数据的时候,不用再考虑表情字符的编码与解码问题。
[mysqld] #服务端基本设置
port = 3306 #MySQL监听端口
socket = /data/mysqldata/3307/mysql.sock #为MySQL客户端程序和服务器之间的本地通讯指定一个套接字文件
pid-file = /data/run/mysql.pid #pid文件所在目录
basedir = /var/lib/mysql #使用该目录作为根目录(安装目录)
datadir = /data/data #数据文件存放的目录
tmpdir = /data/mysqldata/3307/tmp #MySQL存放临时文件的目录
character_set_server = utf8mb4 #服务端默认编码(数据库级别)
collation_server = utf8mb4_bin #服务端默认的比对规则,排序规则
user = mysql #MySQL启动用户
log_bin_trust_function_creators = 1 #This variable applies when binary logging is enabled. It controls whether stored function creators can be trusted not to create stored functions that will cause #unsafe events to be written to the binary log. If set to 0 (the default), users are not permitted to create or alter stored functions unless they have the SUPER #privilege in addition to the CREATE ROUTINE or ALTER ROUTINE privilege. 开启了binlog后,必须设置这个值为1.主要是考虑binlog安全
performance_schema = 0 #性能优化的引擎,默认关闭
secure_auth = 1 #secure_auth 为了防止低版本的MySQL客户端(<4.1)使用旧的密码认证方式访问高版本的服务器。MySQL 5.6.7开始secure_auth 默认为启用值1
#ft_min_word_len = 1 #开启全文索引
#myisam_recover #自动修复MySQL的myisam表
explicit_defaults_for_timestamp #明确时间戳默认null方式
event_scheduler #计划任务(事件调度器)
skip-external-locking #跳过外部锁定;External-locking用于多进程条件下为MyISAM数据表进行锁定
skip-name-resolve #跳过客户端域名解析;当新的客户连接mysqld时,mysqld创建一个新的线程来处理请求。该线程先检查是否主机名在主机名缓存中。如果不在,线程试图解析主机名。
#使用这一选项以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求!
#bind-address = 127.0.0.1 #MySQL绑定IP,允许哪台服务器登录,则在后面添加IP即可,多个IP空格隔开
skip-slave-start #为了安全起见,复制环境的数据库还是设置--skip-slave-start参数,防止复制随着mysql启动而自动启动
slave_net_timeout = 30 #The number of seconds to wait for more data from a master/slave connection before aborting the read. MySQL主从复制的时候,
#当Master和Slave之间的网络中断,但是Master和Slave无法察觉的情况下(比如防火墙或者路由问题)。
#Slave会等待slave_net_timeout设置的秒数后,才能认为网络出现故障,然后才会重连并且追赶这段时间主库的数据。
#1.用这三个参数来判断主从是否延迟是不准确的Slave_IO_Running,Slave_SQL_Running,Seconds_Behind_Master.还是用pt-heartbeat吧。
#2.slave_net_timeout不要用默认值,设置一个你能接受的延时时间。
local-infile = 0 #设定是否支持命令load data local infile。如果指定local关键词,则表明支持从客户主机读文件
back_log = 1024 #指定MySQL可能的连接数量。当MySQL主线程在很短的时间内得到非常多的连接请求,该参数就起作用,之后主线程花些时间(尽管很短)检查连接并且启动一个新线程。
#back_log参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中。
#sql_mode = 'PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,NO_KEY_OPTIONS,NO_TABLE_OPTIONS,NO_FIELD_OPTIONS,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
sql_mode = NO_ENGINE_SUBSTITUTION,NO_AUTO_CREATE_USER #sql_mode,定义了mysql应该支持的sql语法,数据校验等! NO_AUTO_CREATE_USER:禁止GRANT创建密码为空的用户。
#NO_ENGINE_SUBSTITUTION 如果需要的存储引擎被禁用或未编译,可以防止自动替换存储引擎
key_buffer_size = 32M #索引块的缓冲区大小,对MyISAM表性能影响最大的一个参数.决定索引处理的速度,尤其是索引读的速度。默认值是16M,通过检查状态值Key_read_requests
#和Key_reads,可以知道key_buffer_size设置是否合理
max_allowed_packet = 512M #一个查询语句包的最大尺寸。消息缓冲区被初始化为net_buffer_length字节,但是可在需要时增加到max_allowed_packet个字节。
#该值太小则会在处理大包时产生错误。如果使用大的BLOB列,必须增加该值。
#这个值来限制server接受的数据包大小。有时候大的插入和更新会受max_allowed_packet 参数限制,导致写入或者更新失败。
thread_stack = 256K #线程缓存;主要用来存放每一个线程自身的标识信息,如线程id,线程运行时基本信息等等,我们可以通过 thread_stack 参数来设置为每一个线程栈分配多大的内存。
sort_buffer_size = 16M #是MySQL执行排序使用的缓冲大小。如果想要增加ORDER BY的速度,首先看是否可以让MySQL使用索引而不是额外的排序阶段。
#如果不能,可以尝试增加sort_buffer_size变量的大小。
read_buffer_size = 16M #是MySQL读入缓冲区大小。对表进行顺序扫描的请求将分配一个读入缓冲区,MySQL会为它分配一段内存缓冲区。read_buffer_size变量控制这一缓冲区的大小。
#如果对表的顺序扫描请求非常频繁,并且你认为频繁扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能。
join_buffer_size = 16M #应用程序经常会出现一些两表(或多表)Join的操作需求,MySQL在完成某些 Join 需求的时候(all/index join),为了减少参与Join的“被驱动表”的
#读取次数以提高性能,需要使用到 Join Buffer 来协助完成 Join操作。当 Join Buffer 太小,MySQL 不会将该 Buffer 存入磁盘文件,
#而是先将Join Buffer中的结果集与需要 Join 的表进行 Join 操作,
#然后清空 Join Buffer 中的数据,继续将剩余的结果集写入此 Buffer 中,如此往复。这势必会造成被驱动表需要被多次读取,成倍增加 IO 访问,降低效率。
read_rnd_buffer_size = 32M #是MySQL的随机读缓冲区大小。当按任意顺序读取行时(例如,按照排序顺序),将分配一个随机读缓存区。进行排序查询时,MySQL会首先扫描一遍该缓冲,以避免磁盘搜索,
#提高查询速度,如果需要排序大量数据,可适当调高该值。但MySQL会为每个客户连接发放该缓冲空间,所以应尽量适当设置该值,以避免内存开销过大。
net_buffer_length = 16K #通信缓冲区在查询期间被重置到该大小。通常不要改变该参数值,但是如果内存不足,可以将它设置为查询期望的大小。
#(即,客户发出的SQL语句期望的长度。如果语句超过这个长度,缓冲区自动地被扩大,直到max_allowed_packet个字节。)
myisam_sort_buffer_size = 128M #当对MyISAM表执行repair table或创建索引时,用以缓存排序索引;设置太小时可能会遇到” myisam_sort_buffer_size is too small”
bulk_insert_buffer_size = 32M #默认8M,当对MyISAM非空表执行insert … select/ insert … values(…),(…)或者load data infile时,使用树状cache缓存数据,每个thread分配一个;
#注:当对MyISAM表load 大文件时,调大bulk_insert_buffer_size/myisam_sort_buffer_size/key_buffer_size会极大提升速度
thread_cache_size = 384 #thread_cahe_size线程池,线程缓存。用来缓存空闲的线程,以至于不被销毁,如果线程缓存在的空闲线程,需要重新建立新连接,
#则会优先调用线程池中的缓存,很快就能响应连接请求。每建立一个连接,都需要一个线程与之匹配。
query_cache_size = 0 #工作原理: 一个SELECT查询在DB中工作后,DB会把该语句缓存下来,当同样的一个SQL再次来到DB里调用时,DB在该表没发生变化的情况下把结果从缓存中返回给Client。
#在数据库写入量或是更新量也比较大的系统,该参数不适合分配过大。而且在高并发,写入量大的系统,建系把该功能禁掉。
query_cache_type = 0 #决定是否缓存查询结果。这个变量有三个取值:0,1,2,分别代表了off、on、demand。
tmp_table_size = 1024M #它规定了内部内存临时表的最大值,每个线程都要分配。(实际起限制作用的是tmp_table_size和max_heap_table_size的最小值。)
#如果内存临时表超出了限制,MySQL就会自动地把它转化为基于磁盘的MyISAM表,存储在指定的tmpdir目录下
max_heap_table_size = 512M #独立的内存表所允许的最大容量.# 此选项为了防止意外创建一个超大的内存表导致永尽所有的内存资源.
open_files_limit = 10240 #mysql打开最大文件数
max_connections = 2000 #MySQL无论如何都会保留一个用于管理员(SUPER)登陆的连接,用于管理员连接数据库进行维护操作,即使当前连接数已经达到了max_connections。
#因此MySQL的实际最大可连接数为max_connections+1;
#这个参数实际起作用的最大值(实际最大可连接数)为16384,即该参数最大值不能超过16384,即使超过也以16384为准;
#增加max_connections参数的值,不会占用太多系统资源。系统资源(CPU、内存)的占用主要取决于查询的密度、效率等;
#该参数设置过小的最明显特征是出现”Too many connections”错误;
max-user-connections = 0 #用来限制用户资源的,0不限制;对整个服务器的用户限制
max_connect_errors = 100000 #max_connect_errors是一个MySQL中与安全有关的计数器值,它负责阻止过多尝试失败的客户端以防止暴力破解密码的情况。max_connect_errors的值与性能并无太大关系。
#当此值设置为10时,意味着如果某一客户端尝试连接此MySQL服务器,但是失败(如密码错误等等)10次,则MySQL会无条件强制阻止此客户端连接。
table_open_cache = 5120 #表描述符缓存大小,可减少文件打开/关闭次数;
interactive_timeout = 86400 #interactive_time -- 指的是mysql在关闭一个交互的连接之前所要等待的秒数(交互连接如mysql gui tool中的连接
wait_timeout = 86400 #wait_timeout -- 指的是MySQL在关闭一个非交互的连接之前所要等待的秒数
binlog_cache_size = 16M #二进制日志缓冲大小
#我们知道InnoDB存储引擎是支持事务的,实现事务需要依赖于日志技术,为了性能,日志编码采用二进制格式。那么,我们如何记日志呢?有日志的时候,就直接写磁盘?
#可是磁盘的效率是很低的,如果你用过Nginx,,一般Nginx输出access log都是要缓冲输出的。因此,记录二进制日志的时候,我们是否也需要考虑Cache呢?
#答案是肯定的,但是Cache不是直接持久化,于是面临安全性的问题——因为系统宕机时,Cache中可能有残余的数据没来得及写入磁盘。因此,Cache要权衡,要恰到好处:
#既减少磁盘I/O,满足性能要求;又保证Cache无残留,及时持久化,满足安全要求。
slow_query_log = 1 #开启慢查询
long_query_time = 1 #超过的时间为1s;MySQL能够记录执行时间超过参数 long_query_time 设置值的SQL语句,默认是不记录的。
log-slow-admin-statements
log-queries-not-using-indexes #记录管理语句和没有使用index的查询记录
# *** Replication related settings ***
binlog_format = ROW #在复制方面的改进就是引进了新的复制技术:基于行的复制。简言之,这种新技术就是关注表中发生变化的记录,而非以前的照抄 binlog 模式。
#从 MySQL 5.1.12 开始,可以用以下三种模式来实现:基于SQL语句的复制(statement-based replication, SBR),基于行的复制(row-based replication, RBR),
混合模式复制(mixed-based replication, MBR)。相应地,binlog的格式也有三种:STATEMENT,ROW,MIXED。MBR 模式中,SBR 模式是默认的。
#max_binlog_cache_size = 102400 # 为每个session 最大可分配的内存,在事务过程中用来存储二进制日志的缓存。
log-bin = /data/mysqldata/3307/binlog/mysql-bin #开启二进制日志功能,binlog数据位置
log-bin-index = /data/mysqldata/3307/binlog/mysql-bin.index
relay-log = /data/mysqldata/3307/relay/mysql-relay-bin #relay-log日志记录的是从服务器I/O线程将主服务器的二进制日志读取过来记录到从服务器本地文件,
#然后SQL线程会读取relay-log日志的内容并应用到从服务器
relay-log-index = /data/mysqldata/3307/relay/mysql-relay-bin.index #binlog传到备机被写道relaylog里,备机的slave sql线程从relaylog里读取然后应用到本地。
server_id = 100 #服务端ID,用来高可用时做区分
log_slave_updates = 1 #log_slave_updates是将从服务器从主服务器收到的更新记入到从服务器自己的二进制日志文件中。
expire-logs-days = 15 #二进制日志自动删除的天数。默认值为0,表示“没有自动删除”。启动时和二进制日志循环时可能删除。
max_binlog_size = 512M #如果二进制日志写入的内容超出给定值,日志就会发生滚动。你不能将该变量设置为大于1GB或小于4096字节。 默认值是1GB。
replicate-wild-ignore-table = mysql.% #replicate-wild-ignore-table参数能同步所有跨数据库的更新,比如replicate-do-db或者replicate-ignore-db不会同步类似
#replicate-wild-do-table = db_name.% #设定需要复制的Table
#slave-skip-errors = 1062,1053,1146 #复制时跳过一些错误;不要胡乱使用这些跳过错误的参数,除非你非常确定你在做什么。当你使用这些参数时候,MYSQL会忽略那些错误,
#这样会导致你的主从服务器数据不一致。
auto_increment_offset = 1
auto_increment_increment = 2 #这两个参数一般用在主主同步中,用来错开自增值, 防止键值冲突
relay_log_info_repository = TABLE #将中继日志的信息写入表:mysql.slave_realy_log_info
master_info_repository = TABLE #将master的连接信息写入表:mysql.salve_master_info
relay_log_recovery = on #中继日志自我修复;当slave从库宕机后,假如relay-log损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的relay-log,
#并且重新从master上获取日志,这样就保证了relay-log的完整性
# *** innodb setting ***
innodb_buffer_pool_size = 4G #InnoDB 用来高速缓冲数据和索引内存缓冲大小。 更大的设置可以使访问数据时减少磁盘 I/O。
innodb_data_file_path = ibdata1:1G:autoextend #单独指定数据文件的路径与大小
innodb_flush_log_at_trx_commit = 0 #每次commit 日志缓存中的数据刷到磁盘中。通常设置为 1,意味着在事务提交前日志已被写入磁盘, 事务可以运行更长以及服务崩溃后的修复能力。
#如果你愿意减弱这个安全,或你运行的是比较小的事务处理,可以将它设置为 0 ,以减少写日志文件的磁盘 I/O。这个选项默认设置为 0。
#sync_binlog = 1000 #sync_binlog=n,当每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。
innodb_read_io_threads = 8
innodb_write_io_threads = 8 #对于多核的CPU机器,可以修改innodb_read_io_threads和innodb_write_io_threads来增加IO线程,来充分利用多核的性能
innodb_file_format = Barracuda #Innodb Plugin引擎开始引入多种格式的行存储机制,目前支持:Antelope、Barracuda两种。其中Barracuda兼容Antelope格式。
innodb_open_files = 65536 #限制Innodb能打开的表的数量
innodb_purge_threads = 1 #开始碎片回收线程。这个应该能让碎片回收得更及时而且不影响其他线程的操作
innodb_support_xa = FALSE #分布式事务
innodb_log_buffer_size = 256M #InnoDB 将日志写入日志磁盘文件前的缓冲大小。理想值为 1M 至 8M。大的日志缓冲允许事务运行时不需要将日志保存入磁盘而只到事务被提交(commit)。
#因此,如果有大的事务处理,设置大的日志缓冲可以减少磁盘I/O。
innodb_log_file_size = 1G #日志组中的每个日志文件的大小(单位 MB)。如果 n 是日志组中日志文件的数目,那么理想的数值为 1M 至下面设置的缓冲池(buffer pool)大小的 1/n。较大的值,
#可以减少刷新缓冲池的次数,从而减少磁盘 I/O。但是大的日志文件意味着在崩溃时需要更长的时间来恢复数据。
innodb_log_files_in_group = 3 #指定有三个日志组
#innodb_lock_wait_timeout = 120 #在回滚(rooled back)之前,InnoDB 事务将等待超时的时间(单位 秒)
innodb_max_dirty_pages_pct = 75 #innodb_max_dirty_pages_pct作用:控制Innodb的脏页在缓冲中在那个百分比之下,值在范围1-100,默认为90.这个参数的另一个用处:
#当Innodb的内存分配过大,致使swap占用严重时,可以适当的减小调整这个值,使达到swap空间释放出来。建义:这个值最大在90%,最小在15%。
#太大,缓存中每次更新需要致换数据页太多,太小,放的数据页太小,更新操作太慢。
innodb_buffer_pool_instances = 4 #innodb_buffer_pool_size 一致 可以开启多个内存缓冲池,把需要缓冲的数据hash到不同的缓冲池中,这样可以并行的内存读写。
innodb_io_capacity = 500 #这个参数据控制Innodb checkpoint时的IO能力
innodb_file_per_table = 1 #作用:使每个Innodb的表,有自已独立的表空间。如删除文件后可以回收那部分空间。
#分配原则:只有使用不使用。但DB还需要有一个公共的表空间。
innodb_change_buffering = inserts #当更新/插入的非聚集索引的数据所对应的页不在内存中时(对非聚集索引的更新操作通常会带来随机IO),会将其放到一个insert buffer中,
#当随后页面被读到内存中时,会将这些变化的记录merge到页中。当服务器比较空闲时,后台线程也会做merge操作
innodb_adaptive_flushing = 1 #该值影响每秒刷新脏页的操作,开启此配置后,刷新脏页会通过判断产生重做日志的速度来判断最合适的刷新脏页的数量;
transaction-isolation = READ-COMMITTED #数据库事务隔离级别 ,读取提交内容
innodb_flush_method = O_DIRECT #innodb_flush_method这个参数控制着innodb数据文件及redo log的打开、刷写模式
#InnoDB使用O_DIRECT模式打开数据文件,用fsync()函数去更新日志和数据文件。
#innodb_use_sys_malloc = 1 #默认设置值为1.设置为0:表示Innodb使用自带的内存分配程序;设置为1:表示InnoDB使用操作系统的内存分配程序。
[mysqldump]
quick #它强制 mysqldump 从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中
max_allowed_packet = 512M #限制server接受的数据包大小;指代mysql服务器端和客户端在一次传送数据包的过程当中数据包的大小
net_buffer_length = 16384 #TCP/IP和套接字通信缓冲区大小,创建长度达net_buffer_length的行
[mysql]
auto-rehash #auto-rehash是自动补全的意思
[isamchk] #isamchk数据检测恢复工具
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M
[myisamchk] #使用myisamchk实用程序来获得有关你的数据库桌表的信息、检查和修复他们或优化他们
key_buffer = 256M
sort_buffer_size = 256M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout #mysqlhotcopy使用lock tables、flush tables和cp或scp来快速备份数据库.它是备份数据库或单个表最快的途径,完全属于物理备份,但只能用于备份MyISAM存储引擎和运行在数据库目录所在的机器上.
#与mysqldump备份不同,mysqldump属于逻辑备份,备份时是执行的sql语句.使用mysqlhotcopy命令前需要要安装相应的软件依赖包.
4.4 MySQL配置文件优化参考2(按需配置即可)
[mysqld]
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
datadir = /var/lib/mysql
#log-error = /var/log/mysql/error.log
# By default we only accept connections from localhost
#bind-address = 127.0.0.1
# Disabling symbolic-links is recommended to prevent assorted security risks
#支持符号链接,就是可以通过软连接的方式,管理其他目录的数据库,最好不要开启,当一个磁盘或分区空间不够时,可以开启该参数将数据存储到其他的磁盘或分区。
#https://blog.csdn.net/moxiaomomo/article/details/17092871
symbolic-links=0
########basic settings########
server-id = 11
port = 3306
user = mysql
#设置autocommit=0,则用户将一直处于某个事务中,直到执行一条commit提交或rollback语句才会结束当前事务重新开始一个新的事务。set autocommit=0的好处是在频繁开启事务的场景下,减少一次begin的交互。
autocommit = 1
#utf8mb4编码是utf8编码的超集,兼容utf8,并且能存储4字节的表情字符。
#采用utf8mb4编码的好处是:存储与获取数据的时候,不用再考虑表情字符的编码与解码问题。
character_set_server=utf8mb4
skip_name_resolve = 1
max_connections = 800
# 对于同一主机,如果有超出该参数值个数的中断错误连接,则该主机将被禁止连接。如需对该主机进行解禁,执行:FLUSH HOST。
max_connect_errors = 1000
#数据库隔离级别
transaction_isolation = READ-COMMITTED
#MySQL在完成某些join(连接)需求的时候,为了减少参与join的“被驱动表”的读取次数以提高性能,需要使用到join buffer来协助完成join操作当join buffer 太小,MySQL不会将该buffer存入磁盘文件而是先将join buffer中的结果与需求join的表进行操作,然后清空join buffer中的数据,继续将剩余的结果集写入次buffer中
join_buffer_size = 128M
tmp_table_size = 64M
tmpdir = /tmp
#该值设置过小将导致单个记录超过限制后写入数据库失败,且后续记录写入也将失败
max_allowed_packet = 64M
#mysql在关闭一个交互的连接之前所要等待的秒数
interactive_timeout = 1200
#mysql在关闭一个非交互的连接之前所要等待的秒数
wait_timeout = 600
#MySQL读入缓冲区的大小
read_buffer_size = 16M
#MySQL的随机读缓冲区大小
read_rnd_buffer_size = 8M
#MySQL的顺序读缓冲区大小
sort_buffer_size = 8M
########log settings########
log_error = /var/log/docker_log/mysql/error.log
#开启慢查询日志
slow_query_log = 1
#超出次设定值的SQL即被记录到慢查询日志
long_query_time = 6
slow_query_log_file = /var/log/docker_log/mysql/slow.log
#表示记录下没有使用索引的查询
log_queries_not_using_indexes = 1
#记录管理语句
log_slow_admin_statements = 1
#开启复制从库复制的慢查询的日志
log_slow_slave_statements = 1
#设置每分钟增长的没有使用索引查询的日志数量
log_throttle_queries_not_using_indexes = 10
expire_logs_days = 90
min_examined_row_limit = 100
########replication settings########
#将master.info和relay.info保存在表中
master_info_repository = TABLE
relay_log_info_repository = TABLE
log_bin = bin.log
#当每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。设置为零是让系统自行决定
sync_binlog = 5
#开启全局事务ID,GTID能够保证让一个从服务器到其他的从服务器那里实现数据复制而且能够实现数据整合的
gtid_mode = on
#开启gtid,必须主从全开
enforce_gtid_consistency = 1
#从服务器的更新是否写入二进制日志
log_slave_updates = 1
#三种模式 STATEMENT(有可能主从数据不一致,日质量小)、ROW(产生大量二进制日志)、MIXED
binlog_format = mixed
#relay-log日志记录的是从服务器I/O线程将主服务器的二进制日志读取过来记录到从服务器本地文件,然后SQL线程会读取relay-log日志的内容并应用到从服务器
relay_log = /var/log/docker_log/mysql/relay.log
relay_log_recovery = 1
#开启简单gtid,开启此项会提升mysql执行恢复的性能
binlog_gtid_simple_recovery = 1
slave_skip_errors = ddl_exist_errors
########innodb settings########
#这个参数在一开始初始化时就要加入my.cnf里,如果已经创建了表,再修改,启动MySQL会报错。最好为8K
#innodb_page_size = 16K
innodb_page_size = 8K
#数据缓冲区buffer pool大小,建议使用物理内存的 75%
innodb_buffer_pool_size = 2G
#当buffer_pool的值较大的时候为1,较小的设置为8
innodb_buffer_pool_instances = 8
#运行时load缓冲池,快速预热缓冲池,将buffer pool的内容(文件页的索引)dump到文件中,然后快速load到buffer pool中。避免了数据库的预热过程,提高了应用访问的性能
innodb_buffer_pool_load_at_startup = 1
#运行时dump缓冲池
innodb_buffer_pool_dump_at_shutdown = 1
#在innodb中处理用户查询后,其结果在内存空间的缓冲池已经发生变化,但是还未记录到磁盘。这种页面称为脏页,将脏页记录到磁盘的过程称为刷脏
innodb_lru_scan_depth = 2000
innodb_io_capacity = 4000
innodb_io_capacity_max = 8000
#事务等待获取资源等待的最长时间,超过这个时间还未分配到资源则会返回应用失败,默认50s
innodb_lock_wait_timeout = 30
#日志组所在的路径,默认为data的home目录;
innodb_log_group_home_dir = /data/mysql/
#innodb_undo_directory = /data/mysql/undolog/
#这个参数控制着innodb数据文件及redo log的打开、刷写模式,https://blog.csdn.net/gua___gua/article/details/44916207
#innodb_flush_method = O_DIRECT-不经过系统缓存直接存入磁盘,
innodb_file_format = Barracuda
innodb_file_format_max = Barracuda
innodb_strict_mode = 1
#innodb独享表空间,有点很多,缺点会导致单个表文件过大
#innodb_file_per_table = 1
#undo日志回滚段 默认为128
innodb_undo_logs = 128
#传统机械硬盘建议使用,而对于固态硬盘可以关闭
#innodb_flush_neighbors = 1
innodb_log_file_size = 1G
innodb_log_buffer_size = 64M
#控制是否使用独立purge线程
innodb_purge_threads = 1
#改为ON时,允许单列索引最大达到3072。否则最大为767
innodb_large_prefix = 1
innodb_thread_concurrency = 8
#开启后会将所有的死锁记录到error_log中
innodb_print_all_deadlocks = 1
innodb_sort_buffer_size = 16M
########semi sync replication settings########
#半同步复制
plugin_load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
loose_rpl_semi_sync_master_enabled = 1
loose_rpl_semi_sync_slave_enabled = 1
loose_rpl_semi_sync_master_timeout = 5000
#表示转储每个bp instance LRU上最热的page的百分比。通过设置该参数可以减少转储的page数。
innodb_buffer_pool_dump_pct = 40
#刷脏的进程N-1
innodb_page_cleaners = 4
innodb_undo_log_truncate = 1
innodb_max_undo_log_size = 2G
#控制回收(收缩)undo log的频率.undo log空间在它的回滚段没有得到释放之前不会收缩,
innodb_purge_rseg_truncate_frequency = 128
log_timestamps=system
#该参数基于MySQL5.7 Group Replication组复制的,没有使用不要设置
#transaction_write_set_extraction=MURMUR32
#https://www.cnblogs.com/hzhida/archive/2012/08/08/2628826.html
show_compatibility_56=on
五.参考资料
https://www.cnblogs.com/langdashu/p/5889352.html
https://www.2cto.com/database/201704/633451.html