安装系统:CentOS7.3
安装MySQL版本:5.7.41
cmake-3.26.1:CMake是一个跨平台的编译(Build)工具,可以用简单的语句来描述所有平台的编译过程。
ncurses-6.4:ncurses(new curses)是一套编程库,它提供了一系列的函数以便使用者调用它们去生成基于文本的用户界面。
bison-3.8:Bison是一种通用解析器生成器
boost.1.59:Boost是为C++语言标准库提供扩展的一些C++程序库的总称
mysql-5.7.41:关系型数据库管理系统
[root@localhost ~]# rpm -qa | grep mariadb #centos7默认安装了mariadb数据库
mariadb-libs-5.5.52-1.el7.x86_64
[root@localhost ~]# rpm -e mariadb-libs --nodeps #卸载mariadb以免与MySQL冲突
[root@localhost ~]# yum -y install gcc gcc-c++ libaio-devel openssl openssl-devel m4
[root@localhost ~]# cd /usr/local/src/
[root@localhost src]# ll
总用量 156372
-rw-r--r-- 1 root root 5588772 3月 24 21:29 bison-3.8.tar.gz
-rw-r--r-- 1 root root 83709983 3月 24 21:29 boost_1_59_0.tar.gz
-rw-r--r-- 1 root root 10667838 3月 24 21:29 cmake-3.26.1.tar.gz
-rw-r--r-- 1 root root 56535698 3月 24 21:29 mysql-5.7.41.tar.gz
-rw-r--r-- 1 root root 3612591 3月 24 21:29 ncurses-6.4.tar.gz
[root@localhost src]# tar xf cmake-3.26.1.tar.gz
[root@localhost src]# cd cmake-3.26.1
[root@localhost cmake-3.26.1]# ./bootstrap && gmake && gmake install
[root@localhost cmake-3.26.1]# cmake -version #验证安装成功
cmake version 3.26.1
[root@localhost src]# tar xf ncurses-6.4.tar.gz
[root@localhost src]# cd ncurses-6.4
[root@localhost ncurses-6.4]# ./configure && make && make install
[root@localhost src]# tar xf bison-3.8.tar.gz
[root@localhost src]# cd bison-3.8
[root@localhost bison-3.8]# ./configure && make && make install
[root@localhost src]# tar xf boost_1_59_0.tar.gz
[root@localhost src]# mv /usr/local/src/boost_1_59_0 /usr/local/boost
[root@localhost src]# tar xf mysql-5.7.41.tar.gz
[root@localhost src]# cd mysql-5.7.41
[root@localhost mysql-5.7.41]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DSYSCONFDIR=/etc/ -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DEXTRA_CHARSETS=all -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DWITH_SYSTEMD=1 -DWITH_BOOST=/usr/local/boost && make -j $(grep processor /proc/cpuinfo | wc -l) && make install
#编译出现错误:rm -f CMakeCache.txt
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql [MySQL 安装的根目录]
-DMYSQL_DATADIR=/usr/local/mysql /data [MySQL 数据库文件存放目录]
-DSYSCONFDIR=/etc [MySQL 配置文件所在目录]
-DWITH_MYISAM_STORAGE_ENGINE=1 [添加 MYISAM 引擎支持 ]
-DWITH_INNOBASE_STORAGE_ENGINE=1 [添加 InnoDB 引擎支持 ]
-DWITH_ARCHIVE_STORAGE_ENGINE=1 [添加 ARCHIVE 引擎支持 ]
-DMYSQL_UNIX_ADDR=/usr/local/mysql /mysql.sock [指定 mysql.sock 位置 ]
-DWITH_PARTITION_STORAGE_ENGINE=1 [安装支持数据库分区 ]
-DEXTRA_CHARSETS=all [使 MySQL 支持所有的扩展字符]
-DDEFAULT_CHARSET=utf8 [设置 MySQL 的默认字符集为utf8]
-DDEFAULT_COLLATION=utf8_general_ci [设置默认字符集校对规则 ]
-DWITH-SYSTEMD=1 [可以使用 systemd 控制 mysql 服务]
-DWITH_BOOST=/usr/local/boost [指向 boost 库所在目录]
$(grep processor /proc/cpuinfo | wc -l) #获取CPU核心
-j:指定CPU核心数
[root@localhost mysql-5.7.41]# mkdir -p /usr/local/mysql/data
[root@localhost mysql-5.7.41]# groupadd -r mysql && useradd -r -g mysql -s /bin/false -M mysql
[root@localhost mysql-5.7.41]# chown -R mysql:mysql /usr/local/mysql/
[root@localhost mysql-5.7.41]# vi /etc/profile
#最后一行添加
export PATH=$PATH:/usr/local/mysql/bin
[root@localhost mysql-5.7.41]# source /etc/profile
[root@localhost mysql-5.7.41]# mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/
[root@localhost mysql-5.7.41]# vi /etc/my.cnf
#添加一下内容
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
pid-file=/var/run/mysqld/mysqld.pid
socket=/tmp/mysql.sock
log-error=/usr/local/mysql/data/mysql.err
[root@localhost mysql-5.7.41]# cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
[root@localhost mysql-5.7.41]# mkdir /var/run/mysqld/
[root@localhost mysql-5.7.41]# chown mysql:mysql /var/run/mysqld/
[root@localhost mysql-5.7.41]# systemctl start mysqld
[root@localhost mysql-5.7.41]# systemctl enable mysqld
Created symlink from /etc/systemd/system/multi-user.target.wants/mysqld.service to /usr/lib/systemd/system/mysqld.service.
[root@localhost ~]# grep password /usr/local/mysql/data/mysql.err
2023-03-24T14:45:43.955719Z 1 [Note] A temporary password is generated for root@localhost: kwmstuhmz2+X
[root@localhost ~]# mysql -uroot -pkwmstuhmz2+X
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 7
Server version: 5.7.41
Copyright (c) 2000, 2023, Oracle and/or its affiliates.
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>
mysql> alter user root@localhost identified by '123.com';
Query OK, 0 rows affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.01 sec)
mysql> create database test;
Query OK, 1 row affected (0.00 sec)
mysql> use test;
Database changed
mysql> create table t1 (id int,name varchar(10));
Query OK, 0 rows affected (0.00 sec)
mysql>
mysql>
mysql> desc t1;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.02 sec)
mysql> insert into t1 value (1,'zs'),(2,'ls'),(3,'ww');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select * from t1;
+------+------+
| id | name |
+------+------+
| 1 | zs |
| 2 | ls |
| 3 | ww |
+------+------+
3 rows in set (0.00 sec)
当我们网络较好的情况下,可以优先考虑使用yum安装MySQL
https://dev.mysql.com/downloads/repo/yum/ --》找到redhat7下载即可
[root@localhost ~]# ls
anaconda-ks.cfg mysql80-community-release-el7-7.noarchrpm original-ks.cfg
[root@localhost ~]# rpm -ivh mysql80-community-release-el7-7.noarch\ \(1\).rpm
警告:mysql80-community-release-el7-7.noarch.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID 3a79bd29: NOKEY
准备中... ################################# [100%]
正在升级/安装...
1:mysql80-community-release-el7-7 ################################# [100%]
[root@localhost ~]# ls /etc/yum.repos.d/
CentOS-Base.repo epel.repo mysql-community-debuginfo.repo mysql-community.repo mysql-community-source.repo
[root@localhost ~]# vi /etc/yum.repos.d/mysql-community.repo
#使用mysql5.7下载源 关闭mysql8下载源
[mysql57-community]
name=MySQL 5.7 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022
file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
[mysql80-community]
name=MySQL 8.0 Community Server
baseurl=http://repo.mysql.com/yum/mysql-8.0-community/el/7/$basearch
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql-2022
file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
[root@localhost ~]# yum clean all
[root@localhost ~]# yum makecache
[root@localhost ~]# yum -y install mysql-server mysql-devel
[root@localhost ~]# grep password /var/log/mysqld.log
2023-03-25T08:26:20.496170Z 1 [Note] A temporary password is generated for root@localhost: 6;5Z9Tp%)a.b
[root@localhost ~]# mysql -uroot -p'6;5Z9Tp%)a.b'
https://dev.mysql.com/downloads/mysql/ -》下载RPM Bundle
[root@localhost ~]# mkdir /mysql
[root@localhost ~]# cd /mysql/
[root@localhost mysql]# ls
mysql-5.7.41-1.el7.x86_64.rpm-bundle.tar
[root@localhost mysql]# tar xf mysql-5.7.41-1.el7.x86_64.rpm-bundle.tar
[root@localhost mysql]# ls
mysql-5.7.41-1.el7.x86_64.rpm-bundle.tar mysql-community-embedded-devel-5.7.41-1.el7.x86_64.rpm
mysql-community-client-5.7.41-1.el7.x86_64.rpm mysql-community-libs-5.7.41-1.el7.x86_64.rpm
mysql-community-common-5.7.41-1.el7.x86_64.rpm mysql-community-libs-compat-5.7.41-1.el7.x86_64.rpm
mysql-community-devel-5.7.41-1.el7.x86_64.rpm mysql-community-server-5.7.41-1.el7.x86_64.rpm
mysql-community-embedded-5.7.41-1.el7.x86_64.rpm mysql-community-test-5.7.41-1.el7.x86_64.rpm
mysql-community-embedded-compat-5.7.41-1.el7.x86_64.rpm
[root@localhost mysql]# yum -y localinstall mysql*
[root@localhost mysql]# grep "password" /var/log/mysqld.log
2023-03-25T08:51:25.220798Z 1 [Note] A temporary password is generated for root@localhost: pd1Z?gZW+vKk
[root@localhost mysql]# mysql -uroot -p'pd1Z?gZW+vKk'
https://dev.mysql.com/downloads/mysql/ -》Linux-Generric -》 Linux-Generic64位
[root@localhost src]# ls
mysql-5.7.36-linux-glibc2.12-x86_64.tar
[root@localhost src]# rpm -e mariadb-libs-5.5.52-1.el7.x86_64 --nodeps
[root@localhost src]# yum install -y ncurses-devel libaio-devel autoconf
[root@localhost src]# tar zxf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz
[root@localhost src]# mv mysql-5.7.36-linux-glibc2.12-x86_64 mysql
[root@localhost src]# mv mysql /usr/local/
[root@localhost local]# mkdir -p /data/mysql/{data,log}
[root@localhost local]# useradd -s /sbin/nologin -M -r mysql
[root@localhost local]# chown -R mysql:mysql /data/mysql
[root@localhost local]# chown -R mysql:mysql /usr/local/mysql
[root@localhost local]# ln -s /usr/local/mysql/bin/* /usr/local/bin/
[root@localhost local]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql/data
vi /etc/my.cnf
添加一下内容
[client]
port=3306
socket=/usr/local/mysql/mysql.sock
[mysqld]
user=mysql
basedir=/usr/local/mysql
datadir=/data/mysql/data
port=3306
socket=/usr/local/mysql/mysql.sock
symbolic-links=0
character-set-server=utf8
log-error=/data/mysql/log/mysqld.log
pid-file=/usr/local/mysql/mysqld.pid
log_timestamps=system
[root@localhost ~]# mysql &
[root@localhost ~]# netstat -anptl
tcp6 0 0 :::3306 :::* LISTEN 15227/mysqld
[root@localhost ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.36 MySQL Community Server (GPL)
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
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>
[root@localhost ~]# pkill mysqld
[root@localhost ~]# vi /usr/lib/systemd/system/mysqld.service
#添加一下内容
[Unit]
Description=MYSQL server
After=network.target
[Install]
WantedBy=multi-user.target
[Service]
Type=forking
TimeoutSec=0
PermissionsStartOnly=true
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf --daemonize $OPTIONS
ExecReload=/bin/kill -HUP -$MAINPID #这里-HUP可以是改成-s HUP,就变成强制杀进程,有需要可以改,下面也一样
ExecStop=/bin/kill -QUIT $MAINPID #-s QUIT是强制杀进程
KillMode=process
LimitNOFILE=65535
Restart=on-failure
RestartSec=10
RestartPreventExitStatus=1
PrivateTmp=false
#保存退出
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl enable mysqld
Created symlink from /etc/systemd/system/multi-user.target.wants/mysqld.service to /usr/lib/systemd/system/mysqld.service.
[root@localhost ~]# systemctl start mysqld
[root@localhost ~]# netstat -anptl
tcp6 0 0 :::3306 :::* LISTEN 18839/mysqld
[root@localhost ~]# mysql -uroot -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.36 MySQL Community Server (GPL)
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
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>
[root@localhost mysql-5.7.41]# systemctl start mysqld
Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service" and "journalctl -xe" for details.
[root@localhost mysql-5.7.41]# systemctl status mysqld
Process: 84564 ExecStart=/usr/local/mysql/bin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS (code=exited, status=1/FAILURE)
解决:
[root@localhost mysql]# vi /usr/lib/systemd/system/mysqld.service
PIDFile=/var/run/mysqld/mysqld.pid
ExecStart=/usr/local/mysql/bin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid $MYSQLD_OPTS
#注意要与my.cnf配置文件中pid位置相同
#pid-file=/var/run/mysqld/mysqld.pid
[root@localhost mysql-5.7.41]# mkdir /var/run/mysqld/ #需要手动创建
[root@localhost mysql-5.7.41]# chown mysql:mysql /var/run/mysqld/ #赋予权限
解决:
[root@localhost / ]# cd /usr/local/mysql/
[root@localhost mysql]# rm -fr data/
[root@localhost mysql]# mysqld --initialize --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/
[root@localhost mysql]# grep password /usr/local/mysql/data/mysql.err
2023-03-24T14:45:43.955719Z 1 [Note] A temporary password is generated for root@localhost: kwmstuhmz2+X
[root@localhost mysql]# mysql -u root -p
Enter password:
ERROR 2002Enter password: (HY000): Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)
解决:
[root@localhost mysql]# ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock
[client]
#客户端默认端口
port = 3306
#客户端以socket方式运行的默认sock文件位置
socket = /usr/local/mysql/mysql.sock
[mysql]
#修改命令行链接mysql时的提示符
prompt="\u@mysql \R:\m:\s [\d]> "
#是否自动补全
no-auto-rehash
[mysqld]
#用户
user=mysql
#端口
port=3306
#密码认证插件
default_authentication_plugin=mysql_native_password
#支持大小写
lower_case_table_names=1
#软件目录
basedir=/usr/local/mysql
#数据目录
datadir=/data/mysql/data
#保存临时文件的目录
tmpdir =/tmp
#sock文件位置
socket=/usr/local/mysql/mysql.sock
#double write独立
innodb_doublewrite=1
#PID文件位置
pid-file=mysql1.pid
#服务器使用的字符集
character-set-server = utf8mb4
#禁用DNS主机名查找
skip_name_resolve = 1
#若MySQL数据库主要运行在境外,请务必根据实际情况调整本参数
default_time_zone = "+8:00"
#最大打开文件数
open_files_limit= 65535
#MySQL(处理大量请求时,由于满负荷)暂时停止回复新请求前能够堆放的请求数
back_log = 1024
#最大连接数限制
max_connections = 256
#单个用户最大连接数限制
max_user_connections = 64
#最大连接错误数,防止密码暴力破解
max_connect_errors = 10000
#mysql在5.6之前一直都是单列索引限制767,起因是256×3-1。这个3是字符最大占用空间(utf8)。但是在5.6以后,开始支持4个字节的uutf8。255×4>767, 于是增加了这个参数。这个参数默认值是OFF。当改为ON时,允许列索引最大达到3072
#8.0删除
innodb_large_prefix = 1
#是否支持符号链接,即数据库或表可以存储在my.cnf中指定datadir之外的分区或目录,为0不开启
#symbolic-links=1
#mysql监听的ip地址,如果是127.0.0.1,表示仅本机访问
#bind_address = *
#数据修改是否自动提交,为0不自动提交
autocommit = 1
#sql_mode 模式,定义了你MySQL应该支持的sql语法,对数据的校验等等,限制一些所谓的‘不合法’的操作
#sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER"
#所有线程打开表的数目。它的作用就是缓存表文件描述符,降低打开关闭表的频率, 如果这个参数设置得过小,就不得不关闭一些已打开的表以便为缓存新表,从而出现频繁的打开关闭MyISAM表文件的情况,而INNODB表的打开不受这个参数控制,而是放到其数据字典当中,即在ibd文件中。当Opened_tables状态值较大,且不经常使用FLUSH TABLES 关闭并重新打开表,就需要增加该值。
table_open_cache = 1024
#缓存表定义(.frm)文件的数量。如果表较多,可以增大该值加快打开表。与一般表缓存不同,表定义缓存不占用文件描述符,占用空间也小。最小为400,上线为2000,默认为:400 + (table_open_cache / 2)。如果打开表数量高于table_definition_cache,则会通过LRU机制搜索表空间LRU文件列表并刷新列表。对于InnoDB,打开文件的限制为max(table_definition_cache, innodb_open_files)。
table_definition_cache = 1024
#表缓存实例数,为通过减小会话间争用提高扩展性,表缓存会分区为table_open_cache/table_open_cache_instances大小的较小的缓存实例。DML语句会话只需要锁定所在缓存实例,这样多个会话访问表缓存时就可提升性能(DDL语句仍会锁定整个缓存)。默认该值为1,当16核以上可设置为8或16。
table_open_cache_instances = 64
#每个连接线程被创建时,MySQL给它分配的内存大小。当MySQL创建一个新的连接线程时,需要给它分配一定大小的内存堆栈空间,以便存放客户端的请求的Query及自身的各种状态和处理信息。
thread_stack = 512K
#用于多进程条件下为MyISAM数据表进行锁定。
external-locking = FALSE
#mysql最大接受的数据包大小
max_allowed_packet = 32M
#是一个connection级参数,在每个connection第一次需要使用这个buffer的时候,一次性分配设置的内存
sort_buffer_size = 4M
#当我们的join是ALL,index,rang或者Index_merge的时候使用的buffer
join_buffer_size = 4M
#ORDER BY 或者GROUP BY 操作的buffer缓存大小
innodb_sort_buffer_size = 1048576
#建议关闭query cache,有些时候对性能反而是一种损害
#8.0删除
query_cache_size = 0
#线程池缓存大小(当客户端断开连接后,将当前线程缓存起来,当在接到新的连接请求时快速响应,无需创建新的线程 )
thread_cache_size = 384
#服务器关闭交互式连接前等待活动的秒数。交互式客户端定义为在mysql_real_connect()中使用CLIENT_INTERACTIVE选项的客户端
interactive_timeout = 600
#服务器关闭非交互连接之前等待活动的秒数,在线程启动时,根据全局wait_timeout值或全局interactive_timeout值初始化会话wait_timeout值,取决于客户端类型(由mysql_real_connect()的连接选项CLIENT_INTERACTIVE定义)
wait_timeout = 600
#规定了内部内存临时表的最大值,每个线程都要分配。(实际起限制作用的是tmp_table_size和max_heap_table_size的最小值。)如果内存临时表超出了限制,MySQL就会自动地把它转化为基于磁盘的MyISAM表,存储在指定的tmpdir目录下
tmp_table_size = 32M
#用户可以创建的内存表(memory table)的大小.这个值用来计算内存表的最大行数值。
max_heap_table_size = 32M
#是否开启慢日志
slow_query_log = 1
#在MySQL 5.7.2 新增了 log_timestamps 这个参数,该参数主要是控制 error log、genera log,等等记录日志的显示时间参数。 在 5.7.2 之后改参数为默认 UTC 这样会导致日志中记录的时间比中国这边的慢,导致查看日志不方便。修改为 SYSTEM 就能解决问题
log_timestamps = SYSTEM
#慢日志文件路径
slow_query_log_file = /data/mysql/log/slow.log
#错误日志文件路径
log-error = /data/mysql/log/error.log
#大于此时间记录为慢日志query_time-lock_time
long_query_time = 0.1
#是否记录未使用索引的语句
log_queries_not_using_indexes =1
#设定每分钟记录到日志的未使用索引的语句数目,超过这个数目后只记录语句数量和花费的总时间
log_throttle_queries_not_using_indexes = 60
#查询检查返回少于该参数指定行的SQL不被记录到慢查询日志
min_examined_row_limit = 0
#慢查询也记录那些慢的optimize table,analyze table和alter table语句
log_slow_admin_statements = 1
#是否记录由Slave所产生的慢查询
log_slow_slave_statements = 1
#mysql的服务器分配id,在启用主从和集群的时候必须指定,每个节点必须不同
server-id = 33061
#binlog日志文件位置
log-bin = /data/mysql/log/mysql-bin
#这个参数是对于MySQL系统来说是至关重要的,他不仅影响到Binlog对MySQL所带来的性能损耗,而且还影响到MySQL中数据的完整性。对于“sync_binlog”参数的各种设置的说明如下:
#sync_binlog=0,当事务提交之后,MySQL不做fsync之类的磁盘同步指令刷新binlog_cache中的信息到磁盘,而让Filesystem自行决定什么时候来做同步,或者cache满了之后才同步到磁盘。
#sync_binlog=n,当每进行n次事务提交之后,MySQL将进行一次fsync之类的磁盘同步指令来将binlog_cache中的数据强制写入磁盘。
#在MySQL中系统默认的设置是sync_binlog=0,也就是不做任何强制性的磁盘刷新指令,这时候的性能是最好的,但是风险也是最大的。因为一旦系统Crash,在binlog_cache中的所有binlog信息都会被丢失。而当设置为“1”的时候,是最安全但是性能损耗最大的设置。因为当设置为1的时候,即使系统Crash,也最多丢失binlog_cache中未完成的一个事务,对实际数据没有任何实质性影响。从以往经验和相关测试来看,对于高并发事务的系统来说,“sync_binlog”设置为0和设置为1的系统写入性能差距可能高达5倍甚至更多。
sync_binlog = 1
#为每个session分配的内存,在事务过程中用来存储二进制日志的缓存,提高记录bin-log的效率。没有什么大事务,dml也不是很频繁的情况下可以设置小一点,如果事务大而且多,dml操作也频繁,则可以适当的调大一点。
binlog_cache_size = 4M
#表示的是binlog 能够使用的最大cache 内存大小
max_binlog_cache_size = 2G
#最大binlog日志大小
max_binlog_size = 1G
#表示自增长字段从那个数开始,他的取值范围是1 .. 65535
auto_increment_offset=1
#表示自增长字段每次递增的量,其默认值是1,取值范围是1 .. 65535
auto_increment_increment=1
#binlog日志自动过期清理天数,注意:MySQL 8.0开始,binlog_expire_logs_seconds选项也存在的话,会忽略expire_logs_days选项
expire_logs_days = 7
#从机保存主节点信息方式,设成file时 会生成master.info 和 relay-log.info2个文件,设成table,信息就会存在mysql.master_slave_info表中。
master_info_repository = TABLE
#用于保存slave读取relay log的位置信息,可选值为“FILE”、“TABLE”,以便crash重启后继续恢复
relay_log_info_repository = TABLE
#启用gtid类型,否则就是普通的复制架构
gtid_mode = on
#强制GTID的一致性
enforce_gtid_consistency = 1
#slave更新是否记入日志,在做双主架构时异常重要,影响到双主架构是否能互相同步
log_slave_updates
#slave_rows_search_algorithms由三个值的组合组成:TABLE_SCAN,INDEX_SCAN, HASH_SCAN。
#TABLE_SCAN,INDEX_SCAN (默认配置,表示如果有索引就用索引,否则使用全表扫描)
#HASH_SCAN可以部分解决无主键表导致的复制延迟问题。
slave-rows-search-algorithms = 'INDEX_SCAN,HASH_SCAN'
#binlog日志格式,一定设置为row,否则可能会导致各种问题
binlog_format = row
#从机保存同步中继日志的位置
relay_log = /data/mysql/log/relaylog
#当slave从库宕机后,假如relay-log损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的relay-log,并且重新从master上获取日志,这样就保证了relay-log的完整性
relay_log_recovery = 1
#relay_log_purge=1 时,SQL 线程就会自动将之前的 relay log 全部删除。而当 relay_log_purge=0 时,旧的 relay log 则会被保留。虽然这并不会影响从库复制本身,但会有坑。
relay-log-purge = 1
#只对MyISAM表起作用。指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。
key_buffer_size = 32M
#读入缓冲区的大小,将对表进行顺序扫描的请求将分配一个读入缓冲区,MySQL会为它分配一段内存缓冲区
read_buffer_size = 8M
#随机读缓冲区大小,当按任意顺序读取行时(列如按照排序顺序)将分配一个随机读取缓冲区,进行排序查询时,MySQL会首先扫描一遍该缓冲,以避免磁盘搜索,提高查询速度
read_rnd_buffer_size = 4M
#这个参数仅作用于使用 MyISAM存储引擎,用来缓存批量插入数据的时候临时缓存写入数据。mysql会使用这个内存区域来缓存批量结构的数据以帮助批量写入数据文件。
bulk_insert_buffer_size = 64M
#MyISAM表发生变化时重新排序所需的缓冲。
myisam_sort_buffer_size = 128M
#mysql重建索引时允许使用的临时文件最大大小
myisam_max_sort_file_size = 10G
##如果该值大于1,在Repair by sorting过程中并行创建MyISAM表索引(每个索引在自己的线程内)
myisam_repair_threads = 1
#获取元数据锁的超时(以秒为单位)
lock_wait_timeout = 3600
#timestamp列如果没有显式定义为null,默认会被设置为not null属性。(其它的数据类型如果没有显式定义为not null,默认是可以为null的)。该参数可以解决此问题
explicit_defaults_for_timestamp = 1
#InnoDB kernel并发最大的线程数。最少设置为(num_disks+num_cpus)*2。
innodb_thread_concurrency = 0
#自旋锁的轮转数
innodb_sync_spin_loops = 100
#为了防止自旋锁循环过快,耗费CPU,在MySQL5.5.X版本里引入了innodb_spin_wait_delay参数,作用是控制轮训间隔,也就是说在每次轮训的过程中,会休息一会儿然后再轮训。
innodb_spin_wait_delay = 30
#隔离级别
transaction_isolation = READ-COMMITTED
#InnoDB 用来保存数据字典信息和其他内部数据结构的内存池的大小
#innodb_additional_mem_pool_size = 16M
#缓存innodb表的索引,数据,插入数据时的缓冲,专用mysql服务器设置的大小: 操作系统内存的70%-80%最佳
innodb_buffer_pool_size = 500M
#可以开启多个内存缓冲池,把需要缓冲的数据hash到不同的缓冲池中,这样可以并行的内存读写
innodb_buffer_pool_instances = 4
#默认为关闭OFF。如果开启该参数,启动MySQL服务时,MySQL将本地热数据加载到InnoDB缓冲池中
innodb_buffer_pool_load_at_startup = 1
#默认为关闭OFF。如果开启该参数,停止MySQL服务时,InnoDB将InnoDB缓冲池中的热数据保存到本地硬盘
innodb_buffer_pool_dump_at_shutdown = 1
#innodb重做日志保存目录
#innodb_log_group_home_dir = /data/local/mysql/logs/redolog/
#共享表空间大小
innodb_data_file_path = ibdata1:500M:autoextend
#设置临时表空间最大4G
innodb_temp_data_file_path=ibtmp1:200M:autoextend
#redo刷新机制
#0:log buffer将每秒一次地写入log file中,并且log file的flush(刷到磁盘)操作同时进行。该模式下在事务提交的时候,不会主动触发写入磁盘的操作。
#1:每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去,该模式为系统默认。
#2:每次事务提交时MySQL都会把log buffer的数据写入log file,但是flush(刷到磁盘)操作并不会同时进行。该模式下,MySQL会每秒执行一次 flush(刷到磁盘)操作。
innodb_flush_log_at_trx_commit = 1
#事务在内存中的缓冲。这个值不用太大的。他里面的内存一般一秒钟写到磁盘一次
innodb_log_buffer_size = 32M
#这个值定义了日志文件的大小,innodb日志文件的作用是用来保存redo日志。一个事务对于数据或索引的修改往往对应到表空间中的随机的位置,因此当刷新这些修改到磁盘中就会引起随机的I/O,而随机的I/O往往比顺序的I/O更加昂贵的开销,因为随机的I/O需要更多的开销来定位到指定的位置。innodb使用日志来将随机的I/O转为顺序的I/O,只要日志文件是安全的,那么事务就是永久的,尽管这些改变还没有写到数据文件中,如果出现了当机或服务器断电的情况,那么innodb也可以通过日志文件来恢复以及提交的事务。但是日志文件是有一定的大小的,所以必须要把日志文件记录的改变写到数据文件中,innodb对于日志文件的操作是循环的,即当日志文件写满后,会将指针重新移动到文件开始的地方重新写,但是它不会覆盖那些还没有写到数据文件中的日志,因为这是唯一记录了事务持久化的记录。如果对 Innodb 数据表有大量的写入操作,那么选择合适的 innodb_log_file_size 值对提升MySQL性能很重要。然而设置太大了,就会增加恢复的时间,因此在MySQL崩溃或者突然断电等情况会令MySQL服务器花很长时间来恢复
innodb_log_file_size = 128MB
#重做日志组数
innodb_log_files_in_group = 2
#undo表空间文件超过此值即标记为可收缩
innodb_max_undo_log_size = 4G
#回滚日志目录
innodb_undo_directory = /data/mysql/data
#用于设定创建的undo表空间的个数,在mysql_install_db时初始化后,就再也不能被改动了;默认值为0,表示不独立设置undo的tablespace,默认记录到ibdata中;否则,则在undo目录下创建这么多个undo文件,例如假定设置该值为2,那么就会创建命名为undo001~undo002的undo tablespace文件,每个文件的默认大小为10M。
innodb_undo_tablespaces = 2
#根据服务器IOPS能力适当调整
#一般配普通SSD盘的话,可以调整到 10000 - 20000
#配置高端PCIe SSD卡的话,则可以调整的更高,比如 50000 - 80000
innodb_io_capacity = 4000
#这两个设置会影响InnoDB每秒在后台执行多少操作. 大多数写IO(除了写InnoDB日志)是后台操作的. 如果你深度了解硬件性能(如每秒可以执行多少次IO操作),则使用这些功能是很可取的,而不是让它闲着
innodb_io_capacity_max = 8000
#innodb_flush_sync默认情况下启用 的变量innodb_io_capacity导致在检查点发生I / O活动突发期间忽略该 设置 。要遵守innodb_io_capacity设置定义的I / O速率 ,请禁用innodb_flush_sync。
innodb_flush_sync = 0
#InnoDB存储引擎在刷新一个脏页时,会检测该页所在区(extent)的所有页,如果是脏页,那么一起刷新。这样做的好处是通过AIO可以将多个IO写操作合并为一个IO操作。对于传统机械硬盘建议使用,而对于固态硬盘可以关闭。
innodb_flush_neighbors = 0
#innodb写线程数
innodb_write_io_threads = 8
#innodb读线程数
innodb_read_io_threads = 8
#purge线程数量(清除二进制日志)
innodb_purge_threads = 4
#从InnoDB的master线程中,独立出了一个页面清理进程来刷脏页。
innodb_page_cleaners = 4
#指定MySQL可同时打开.ibd文件的最大个数,最小为10,默认300。此选项只针对InnoDB表打开的.ibd文件描述符,独立于open_files_limit。
innodb_open_files = 65535
#当系统中 脏页 所占百分比超过这个值,INNODB就会进行写操作以把页中的已更新数据写入到磁盘文件中。默认75,一般现在流行的SSD硬盘很难达到这个比例。可依据实际情况在75-80之间调节
innodb_max_dirty_pages_pct = 50
#默认值为 fdatasync. 如果使用 硬件RAID磁盘控制器, 可能需要设置为 O_DIRECT. 这在读取InnoDB缓冲池时可防止“双缓冲(double buffering)”效应,否则会在文件系统缓存与InnoDB缓存间形成2个副本(copy). 如果不使用硬件RAID控制器,或者使用SAN存储时, O_DIRECT 可能会导致性能下降
innodb_flush_method = O_DIRECT
#该参数会影响page cleaner线程每次刷脏页的数量,这是一个每1秒loop一次的线程
innodb_lru_scan_depth = 4000
#设置checksum函数的算法
innodb_checksum_algorithm = crc32
#事务等待获取资源等待的最长时间,超过这个时间还未分配到资源则会返回应用失败;参数的时间单位是秒
innodb_lock_wait_timeout = 10
#0表示rollback最后一条语句,默认值;有点坑
#1表示回滚事务B内所有的statements;
innodb_rollback_on_timeout = 1
#是否将死锁相关信息保存到MySQL 错误日志中
innodb_print_all_deadlocks = 1
#是否开启独立表空间
innodb_file_per_table = 1
#online ddl row log 大小
innodb_online_alter_log_max_size = 4G
#是否自动更新统计信息
innodb_stats_on_metadata = 0
#开启在线回收(收缩)undo log日志文件
innodb_undo_log_truncate = 1
#磁盘临时表引擎
#internal_tmp_disk_storage_engine = InnoDB
#错误日志等级
log_error_verbosity = 3
#InnoDB 在执行过程中将 DDL 日志写入 mysql.innodb_ddl_log 表中
#innodb_print_ddl_logs = 1
#binlog失效时间,秒级别
#binlog_expire_logs_seconds = 604800
#MySQL自适应设置内存大小
#innodb_dedicated_server = 0
#启用InnoDB的status file,便于管理员查看以及监控
#innodb_status_file = 1
#注意: 开启 innodb_status_output & innodb_status_output_locks 后, 可能会导致log-error文件增长较快
#打印show engine innodb status的信息到日志
#innodb_status_output = 0
#打印死锁信息到日志
#innodb_status_output_locks = 0
#这个参数控制了当mysql启动或重启时,mysql在搜寻GTIDs时是如何迭代使用binlog文件的。 这个选项设置为真,会提升mysql执行恢复的性能。因为这样mysql-server启动和binlog日志清理更快
#binlog_gtid_simple_recovery = 1
#跳过指定error no类型的错误,设成all 跳过所有错误
#slave_skip_errors = ddl_exist_errors
#组提交&并行复制
#并行模式
#slave_parallel_type=LOGICAL_CLOCK
#并行线程数
#slave_parallel_workers=2
#组提交时间(us)
#binlog_group_commit_sync_delay=1000000
#组提交数量
#binlog_group_commit_sync_no_delay_count=10
#当复制组间通信的event超过这一阈值时,启用LZ4压缩,以减小通信量
#group_replication_compression_threshold=100
#半同步
#加载插件,8.0.18引入了破坏性变更,像半同步插件这样的非必要插件是不会被加载的
#plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"
#控制主库上是否开启semisync
#rpl-semi-sync-master-enabled = 1
#控制从库上是否开启semisync
#rpl-semi-sync-slave-enabled = 1
#单位毫秒,防止半同步复制在没有收到确认的情况下,发送堵塞。master在超时之前没有收到确认,将恢复到异步复制,继续执行半同步没有进行的操作
#rpl_semi_sync_master_timeout=5000
#提交顺序保持一致
#slave_preserve_commit_order=1
#redo归档目录
#innodb_redo_log_archive_dirs=/back/redo
###MGR###
#因为集群会在故障恢复时互相检查binlog的数据,所以需要记录下集群内其他服务器发过来已经执行过的binlog,按GTID来区分是否执行过.
log-slave-updates=1
#binlog_transaction_dependency_tracking是设在主库,可以取commit_order,writeset,writeset_session,主要是控制binlog文件中last_committed的计算方式:
#commit_order即group commit,同在prepare阶段的事务,在binlog中last_committed数值一样,传到从库之后可以并行执行;
#writeset,会对事务处理的行数据哈希出一个writeset值,放到一个哈希表里,如果两个事务先后提交,但是处理的行数据没有冲突,即wirteset不一样,就可以有同样的last_committed,在从库可以并行执行;
#writeset_session,比writeset多了一个约束,同一个session的事务,在binlog里保留先后顺序,也就是last_committed按先后顺序递增。
#binlog_transaction_dependency_tracking=writeset_session
[mysqldump]
#在备份数据量比较大的表时有用。会将数据读入内存,在输出完成之前会存在内存缓冲区。
quick
#mysqldump限制server接受的数据包大小
max_allowed_packet = 32