# 查看
$ rpm -qa | grep mariadb
mariadb-libs-5.5.68-1.el7.x86_64
# 卸载
$ rpm -e mariadb-libs-5.5.68-1.el7.x86_64 --nodeps
# 确认
$ rpm -qa | grep mariadb
MySQL 官网下载地址:
https://dev.mysql.com/downloads/mysql/
使用如下命令查看系统的 glibc 版本:
$ ldd --version
ldd (GNU libc) 2.17
在下载页面选择
点击 Compressed TAR Archive 获取下载地址。下文以 https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.32-linux-glibc2.17-x86_64-minimal.tar.xz 为例进行说明。
下载:
$ curl -ssL -O https://dev.mysql.com/get/Downloads/MySQL-8.0/mysql-8.0.32-linux-glibc2.17-x86_64-minimal.tar.xz
解压:
$ tar xJvf mysql-8.0.32-linux-glibc2.17-x86_64-minimal.tar.xz
重命名:
$ mkdir -p /opt/software
$ mv mysql-8.0.32-linux-glibc2.17-x86_64-minimal /opt/software/mysql8
# 创建组
$ groupadd mysql
# 创建用户,并且将其添加到上一步创建的组
$ useradd -r -g mysql mysql
# 创建数据目录
$ mkdir -p /data/mysql8/data/
# 更改属主和属组
$ chown -R mysql:mysql /data/mysql8
# 更改权限
$ chmod -R 750 /data/mysql8
xxxxxxxxxx
$ sudo yum install -y libaio libaio-devel
/opt/software/mysql8/my.cnf:
xxxxxxxxxx
[mysqld]
# 禁用主机缓存
host_cache_size=0
# 禁用 DNS 主机查询
skip-name-resolve
# 以用户 user 的身份运行 mysqld
user=mysql
# 绑定的地址
bind-address=0.0.0.0
# 端口
port=3306
# 默认存储引擎
default-storage-engine=InnoDB
# 关闭交互连接前等待的秒数
interactive_timeout=300
# 关闭非交互连接前等待的秒数
wait_timeout=300
# 最大连接数
max_connections=8192
# 每个数据库用户的最大连接数。0 表示不限制
max_user_connections=0
# 用于控制 MySQL 监听 TCP 端口时,设置的积压请求栈大小。
# 当 MySQL 的连接数达到 max_connections 时,新进入的请求将被存在堆栈中,
# 以等待某一连接释放资源,该堆栈的数量即 back_log。
# 如果等待连接的数量超过 back_log,将不被授予连接资源。
# back_log 值不能超过 TCP/IP 连接的监听队列大小。若超过,则无效。
# 查看当前系统的 TCP/IP 连接的监听队列大小的命令是 cat /proc/sys/net/ipv4/tcp_max_syn_backlog。
# 对于 Linux 系统,推荐设置为小于 512 的整数
back_log=512
# 线程池缓存线程数量的大小。
# 当客户端断开连接后,将当前线程缓存起来,在接收到新的连接请求时,无需创建新线程。
# 这对那些使用短连接的应用程序来说,可以极大提高创建连接的效率。为提高性能可以增大该参数的值。
# 默认为 60,可以设置为 120
thread_cache_size=120
#### #### #### ####
#### 路径配置
#### #### #### ####
# Unix Socket 路径
socket=/data/mysql8/mysqld.sock
# PID 文件
pid-file=/data/mysql8/mysqld.pid
# 数据目录
datadir=/data/mysql8/data
# 指定 MySQL 安装的绝对路径
basedir=/opt/software/mysql8
# 限制文件 import/export 操作。可选值为:
# '' - 不对文件 import/export 进行限制
# 路径名 - 只能 import/export 该目录下的文件
# NULL - 禁用文件 import/export 操作
secure-file-priv=''
#### #### #### ####
#### binary log 配置
#### #### #### ####
# 禁用 binglog
skip-log-bin
# 开启 binlog,并且设置二进制日志文件名前缀
#log-bin=mysql-bin
# 二进制日志的格式。可选值为 STATEMENT、ROW、MIXED。
# 目前,业内推荐使用ROW 模式,准确性高,但文件大
#binlog_format = ROW
# 单个二进制文件的最大大小。
# 默认为 1G,如果超过该值,将写入新文件,并且记录到 .index 文件
#max_binlog_size=1G
# 所有未提交的 binlog 将被写到缓存中,事务提交后,再将缓存刷新到文件。
# 缓存大小由参数 binlog_cache_size 控制。
# 该值基于 Session,每个事务都被分配一个大小为 binlog_cache_size 的缓存。
# 当一个事务的记录大于该值时,MySQL 将缓存中的日志写入临时文件。
# 因此,需要根据使用场景合理设置该参数,过大或者过小都将影响性能
#binlog_cache_size=4M
# 每写多少次缓存,将其同步到磁盘。
# N = 1 表示采用同步写磁盘的方式,写二进制日志。
# 这时写操作不使用操作系统的缓存,每次事务提交都将写入文件;
# N = 0 表示 MySQL 不控制 binlog 的刷新,由文件系统自己控制它的缓存的刷新。
# 此时性能最好,但是风险最大。因为一旦系统 Crash,binlog_cache 中的所有 binlog 都将丢失
#sync_binlog=0
# 为防止 binlog 文件过大,导致无可用的磁盘空间。MySQL 提供系统变量配置过期时间。
# MySQL 5.7 时变量名为 expire_logs_days,精确度为天;
# MySQL 8.0 使用 binlog_expire_logs_seconds,其效果和名字一样,精确度由天变为秒。
# 超过该时间的 binlog 将被清理
#binlog_expire_logs_seconds=43200
#### #### #### ####
#### InnoDB 配置
#### #### #### ####
# 用于定义 Redo Log 的总大小。
# 容量不足,将导致性能问题;设置得过大将浪费磁盘空间,并且在崩溃恢复时,恢复时长增加
innodb_redo_log_capacity=8G
# 表示何时将缓冲区的数据写入日志文件,并且将日志文件写入磁盘。
# 该参数对于 InnoDB 引擎非常重要。该参数有 3 个值,分别为 0、1 和 2,默认值为 1。
# 0 表示以每秒 1 次的频率将数据写入日志文件,并且将日志文件写入磁盘。
# 每个事务的 Commit 不会触发前面的任何操作。该模式速度最快,但不太安全,
# mysqld 进程的崩溃将导致上一秒内的所有事务数据丢失。
# 1 表示每次提交事务时,将数据写入日志文件,并且将日志文件写入磁盘,进行同步。
# 该模式最安全,但也最慢。因为每次事务提交或回滚都需要将日志写入(flush)磁盘。
# 2 表示每次提交事务时,将数据写入日志文件,每隔 1 秒将日志文件写入磁盘。
# 该模式速度较快,也比 0 安全,
# 只有在操作系统崩溃或者系统断电的情况下,上一秒钟内的所有事务数据才可能丢失
innodb_flush_log_at_trx_commit=0
# 设置用于 MySQL 中最重要的数据缓存的内存总量。
# 对于专用服务器,设置为内存总量的 70%,否则设置为 10%
innodb_buffer_pool_size=64G
# 该选项仅在将 innodb_buffer_pool_size 设置为 1GB 及以上时生效。
# 缓冲池大小在所有缓冲池中进行划分。为获得最佳效率,
# 指定 innodb_buffer_pool_instances 和 innodb_buffer_pool_size 的组合,
# 使每个缓冲池实例至少 1GB
innodb_buffer_pool_instances=32
# InnoDB 存储引擎的事务日志所使用的缓冲区。
# InnoDB 在写事务日志时,为提高性能,先将信息写入 InnoDB Log Buffer。
# 当满足参数 innodb_flush_log_at_trx_commit 设置的条件或日志缓冲区写满时,将日志写到文件中。
# 如果设置得太小,将明显降低 InnoDB 的性能;
# 如果设置得过大,如果数据库意外宕机,那么将导致恢复时间很长
innodb_log_buffer_size=8G
# 该参数有助于在最小代价的情况下,进行线程之间的上下文切换。
# InnoDB 可以使用各种技术限制操作系统并发执行的线程数量
# (因此大批量的请求可以在任何时间得到处理)。当 InnoDB 从用户会话收到新请求时,
# 如果并发执行的线程数量达到预定义的限制,那么新请求将睡眠一段时间后再尝试。
# 不能按计划执行的请求将被放入先入/先出队列。等待获取锁的线程不被计入并发执行的线程数量中。
# 可以通过设置参数 innodb_thread_concurrency 限制并发线程的数量。
# 一旦执行线程的数量达到该限制,额外的线程在被放置到队列中之前,将睡眠数微秒。
# 可以通过参数 innodb_thread_sleep_delay 配置睡眠时间。
# 在 MySQL 5.6.3 及更高版本中,可以通过参数 innodb_adaptive_max_sleep_delay,
# 为 innodb_thread_sleep_delay 设置最大允许的值。
# InnoDB 根据当前线程调度活动自动调整 innodb_thread_sleep_delay 的值,
# 这种动态调整机制有助于工作线程在系统负载低时或系统接近满负荷运转时,能够顺利地调度。
# 0 表示不限制
innodb_thread_concurrency=0
#### #### #### ####
#### buffer 配置
#### #### #### ####
# 索引缓冲区的大小。其被所有线程共享。增加它可得到更好处理的索引(对所有读和多重写)。
# 它是对 MyISAM 表性能影响最大的参数。如果设置得太大,系统将开始换页,并且变慢。
# 它决定索引处理的速度,尤其是读的速度。对于内存在 4GB 左右的服务器,该参数可设置为 256M 或 384M。
# 未命中概率为 Key_reads/Key_read_requests。若命中率较低,则建议适当修改该值
key_buffer_size=8G
# 联合查询操作所能使用的缓冲区大小。该参数对应的分配内存为每个连接独享
join_buffer_size=64M
# 执行排序使用的缓冲大小。如果想要增加 ORDER BY 的速度,应该首先查看是否可以让 MySQL 使用索引,
# 而非额外的排序阶段。如果不能,那么尝试增加 sort_buffer_size 变量的大小。
# 对于内存在 4GB 左右的服务器,推荐设置为 6-8 M,
# 如果有 100 个连接,那么实际分配的排序缓冲区大小为 100 * 6 = 600MB
sort_buffer_size=64M
# 读入缓冲区大小。对表进行顺序扫描的请求将被分配一个读入缓冲区。
# 如果对表的顺序扫描请求非常频繁,可以通过增加该变量的值以及内存缓冲区大小,提高其性能
read_buffer_size=64M
# 随机读缓冲区大小。当按任意顺序读取行时(比如,按照排序顺序),将被分配一个随机读缓冲区。
# 进行排序时,MySQL 首先扫描该缓冲,以避免磁盘搜索,提高查询速度。
# 如果需要排序大量数据,那么可适当调高该值。
# 但 MySQL 为每个连接发放该缓冲空间,所以应尽量适当设置该值,以避免内存开销过大
read_rnd_buffer_size=64M
[client]
socket=/data/mysql8/mysqld.sock
xxxxxxxxxx
$ /opt/software/mysql8/bin/mysqld --defaults-file=/opt/software/mysql8/my.cnf --basedir=/opt/software/mysql8/ --datadir=/data/mysql8/data --user=mysql --initialize-insecure
其中:
--defaults-file
:指定配置文件,需要放在 --initialize
前面--basedir
:指定安装目录--datadir
:指定数据目录--user
:指定用户--initialize-insecure
:初始化,无密码xxxxxxxxxx
$ sudo /opt/software/mysql8/bin/mysqld_safe --defaults-file=/opt/software/mysql8/my.cnf &
# 查看进程。
# 可以看到 mysqld_safe 和 mysqld 进程
$ ps aux | grep mysqld
xxxxxxxxxx
# 无密码登陆 root
$ /opt/software/mysql8/bin/mysql --defaults-file=/opt/software/mysql8/my.cnf -uroot --skip-password
xxxxxxxxxx
# 在本例中,将 root 的密码设置为 root,可按需修改
$ /opt/software/mysql8/bin/mysql --defaults-file=/opt/software/mysql8/my.cnf -uroot --skip-password -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root'; FLUSH PRIVILEGES;"
xxxxxxxxxx
# 创建账号 test,其密码为 test;并且授予其对所有数据库的所有权限
$ /opt/software/mysql8/bin/mysql --defaults-file=/opt/software/mysql8/my.cnf -uroot -proot -e "CREATE USER 'test'@'%' IDENTIFIED BY 'test'; GRANT ALL PRIVILEGES ON *.* TO 'test'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;"
# 测试新创建的账号
$ /opt/software/mysql8/bin/mysql -utest -ptest -h127.0.0.1 -P3306 -e "SELECT 1"
xxxxxxxxxx
$ sudo yum install -y automake libtool git
xxxxxxxxxx
$ git clone https://github.com/akopytov/sysbench
$ cd sysbench/
# 切换到 1.0.20
$ git checkout refs/tags/1.0.20
xxxxxxxxxx
$ ./autogen.sh
# 注意将 mysql_config 的路径添加到 PATH 环境变量值中
$ PATH=$PATH:/opt/software/mysql8/bin ./configure
$ make
$ sudo make install
xxxxxxxxxx
$ sysbench --version
sysbench 1.0.20-ebf1c90
名称 | 描述 |
---|---|
oltp_read_only | 测试只读性能 |
oltp_read_write | 测试综合读写性能 |
oltp_delete | 测试删除性能 |
oltp_update_index | 测试更新索引字段性能 |
oltp_update_non_index | 测试更新非索引字段性能 |
oltp_insert | 测试插入性能 |
oltp_write_only | 测试写入性能 |
--threads=N
:使用的线程数量--events=N
:事件总数的限制--time=N
:总执行事件的限制,单位是秒--rate=N
:平均事务速率。0 表示不限制速率--report-interval=N
:周期性地按照指定的时间间隔(单位是秒)上报中间统计数据。0 禁用中间报告--db-driver=STRING
:指定使用的数据库驱动。比如 mysql--mysql-host=[LIST,...]
:MySQL 服务主机--mysql-port=[LIST,...]
:MySQL 服务端口--mysql-socket=[LIST,...]
:MySQL Socket--mysql-user=STRING
:MySQL 用户名--mysql-password=STRING
:MySQL 密码--mysql-db=STRING
:MySQL 数据库名称--mysql-compression[=on|off]
:使用压缩,如果在客户端库中可用xxxxxxxxxx
# 创建测试数据库
$ /opt/software/mysql8/bin/mysql -utest -ptest -h127.0.0.1 -P3306 -e "CREATE DATABASE loadtest;"
# 准备数据
$ sysbench --threads=1000 --events=0 --time=1800 --rate=0 --report-interval=10 --db-driver=mysql --mysql-socket=/data/mysql8/mysqld.sock --mysql-port=3306 --mysql-user=test --mysql-password=test --mysql-db=loadtest oltp_insert prepare
# 执行测试
$ sysbench --threads=1000 --events=0 --time=1800 --rate=0 --report-interval=10 --db-driver=mysql --mysql-socket=/data/mysql8/mysqld.sock --mysql-port=3306 --mysql-user=test --mysql-password=test --mysql-db=loadtest oltp_insert run
# 清理数据
$ sysbench --threads=1000 --events=0 --time=1800 --rate=0 --report-interval=10 --db-driver=mysql --mysql-socket=/data/mysql8/mysqld.sock --mysql-port=3306 --mysql-user=test --mysql-password=test --mysql-db=loadtest oltp_insert cleanup
xxxxxxxxxx
$ uname -a
Linux node-10-2-12-46 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
如果服务器架构是 NUMA,那么需要修改 mysqld_safe。
安装 iostat 和 iotop:
xxxxxxxxxx
$ sudo yum install -y systat iotop
iotop
命令是用于监视磁盘 I/O 使用状况的 top 类工具。
xxxxxxxxxx
# 按 q 退出 iotop 界面
$ iotop
# -p 选项用于指定要监视的进程/线程
$ iotop -p <PID>
iostat
命令主要用于输出磁盘 I/O 和 CPU 的统计信息。常用选项包括:
-x
:显示详细信息-d
:显示磁盘使用情况-k
:以 KB 为单位显示;-m
:以 MB 为单位显示比如:
xxxxxxxxxx
$ iostat -d -m -x sdb 1 3
上面的命令以 MB 为单位显示磁盘 sdb 的详细使用情况。输出的时间间隔为 1 秒,输出次数为 3 次,如果想输出无限次,那么省略 3。
下面是一个输出示例:
xxxxxxxxxx
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdb 0.00 0.00 0.00 1513.00 0.00 115.14 155.85 2.21 1.46 0.00 1.46 0.19 28.10
每列的含义如下:
rrqm/s
:每秒完成的 merge 读操作数wrqm/s
:每秒完成的 merge 写操作数r/s
:每秒完成的读 I/O 次数w/s
:每秒完成的写 I/O 次数rMB/s
:每秒读取数据量,单位 MBwMB/s
:每秒写入数据量,单位 MBavgrq-sz
:每次 I/O 的平均扇区数,即所有请求的平均大小,以扇区(512字节)为单位avgqu-sz
:请求队列的平均长度await
:每次 I/O 平均花费的时间,包括在队列等待的时间,也包括磁盘控制器处理本次请求的有效时间r_await
:每次读操作平均花费的时间,不仅包括硬盘设备读取的时间,也包括在内核队列中的时间w_await
:每次写操作平均花费的时间,不仅包括硬盘设备读取的时间,也包括在内核队列中的时间svctm
:已废弃%util
:工作时间或者繁忙时间占总时间的百分比查看 CPU 线程数
xxxxxxxxxx
cat /proc/cpuinfo | grep "processor" | wc -l
查看每个物理 CPU 的核心数
xxxxxxxxxx
cat /proc/cpuinfo | grep "cores" | uniq
查看物理 CPU 个数
xxxxxxxxxx
cat /proc/cpuinfo | grep "physical id" | sort | uniq
如果物理 CPU 个数 * 每个物理 CPU 的核心数 = CPU 线程数,则表示未开启超线程。
查看内存
xxxxxxxxxx
free -g
查看操作系统信息
xxxxxxxxxx
cat /etc/os-release
对于 CentOS,可以通过如下命令查看版本:
xxxxxxxxxx
cat /etc/redhat-release
查看文件系统/磁盘使用情况
xxxxxxxxxx
df -hT
# 查看 inode
df -hi
查看磁盘是否为 SSD
xxxxxxxxxx
# 输出 0 表示是 SSD。注意:按需替换 sdb
cat /sys/block/sdb/queue/rotational