安装前准备
创建运行 mariadb 的用户 mysql

1.添加运行 mariadb 的用户 mysql, 不允许其登录系统:

1
[ -z "$(egrep mysql /etc/passwd)" ] && useradd -s /sbin/nologin mysql
创建数据存放目录

1.创建 mariadb 数据存放目录 /data/mysql

1
[ ! -d '/data/mysql' ] && mkdir -p /data/mysql
安装 mariadb
下载安装二进制 mariadb

1.下载 mariadb 二进制包到 /usr/local/src/ 目录:

1
wget -O /usr/local/src/mariadb-10.6.4-linux-systemd-x86_64.tar.gz https://down.linuser.com/linux_soft/mariadb-10.6.4-linux-systemd-x86_64.tar.gz

2.解压下载的 mariadb 二进制包:

1
tar zxf /usr/local/src/mariadb-10.6.4-linux-systemd-x86_64.tar.gz -C /usr/local/src/

3.将解压出来的目录重命名并移动到 /usr/local/ 目录下:

1
mv /usr/local/src/mariadb-10.6.4-linux-systemd-x86_64 /usr/local/mysql

4.进入重命名后的 mariadb 目录 /usr/local/mysql

1
cd /usr/local/mysql/

5.将数据目录和重命名后的 mariadb 目录 /usr/local/mysql 的所属主和组都修改为 mysql:

1
chown -R mysql.mysql /data/mysql /usr/local/mysql

6.执行如下命令安装 mariadb:

1
./scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/data/mysql --skip-name-resolve --user=mysql
配置 /etc/my.cnf

1.先备份 /etc/my.cnf 文件:

1
[ -f '/etc/my.cnf' ] && mv /etc/my.cnf{,.bak}

2.重新配置 /etc/my.cnf,配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
cat << eof > /etc/my.cnf
[client]
port = 3306
socket = /tmp/mysql.sock

[mysqld]
port = 3306
socket = /tmp/mysql.sock
user = mysql
basedir = /usr/local/mysql
datadir = /data/mysql
log_error = /data/mysql/mysql.err
pid-file = /data/mysql/mysql.pid

# 禁用DNS解析,使用IP访问的情况下加快访速度。
skip_name_resolve
skip-external-locking
#skip-networking
# 关闭认证,重置 root 密码
# skip-grant-tables

# 这个参数用来缓存MyISAM存储引擎的索引参数。MySQL5.5默认为InnoDB存储引擎,所以这个参数可以设置小点,64MB即可。
key_buffer_size = 64M

# 每个连接传输数据大小.最大1G,须是1024的倍数,一般设为最大的BLOB的值。
# 允许最大接收数据包的大小,防止服务器发送过大的数据包。可以设置为16MB或者更大,但设置的太大也可能有危险。
max_allowed_packet = 1M

# #MySQL每打开一个表,都会读入一些数据到table_open_cache缓存中,当MySQL在这个缓存中找不到相应信息时,才会去磁盘上读取。
# 默认值64,假定系统有200个并发连接,则需将此参数设置为200*N(N为每个连接所需的文件描述符数目);
# 当把table_open_cache设置为很大时,如果系统处理不了那么多文件描述符,那么就会出现客户端失效,连接不上。
table_open_cache = 256

# 排序缓冲被用来处理类似ORDER BY以及GROUP BY队列所引起的排序。
# 在表进行order by和group by排序操作时,由于排序的字段没有索引,会出现Using filesort,为了提高性能,可用此参数增加每个线程分配的缓冲区大小。
# 默认为256KB,这个参数不要设置过大,一般在128~256KB即可。另外,一般出现Using filesort的时候,要通过增加索引来解决。
sort_buffer_size = 1M

# 不带索引的全表扫描.使用的buffer的最小值
join_buffer_size = 16M

# 包消息缓冲区初始化为net_buffer_length字节,但需要时可以增长到max_allowed_packet字节。
net_buffer_length = 8K

# 该参数用于表的顺序扫描,表示每个线程分配的缓冲区大小。
# 比如在进行全表扫描时,MySQL会按照数据的存储顺序依次读取数据块,每次读取的数据块首先会暂存在read_buffer_size中
# 当buffer空间被写满或者全部数据读取结束后,再将buffer中的数据返回给上层调用者,以提高效率。
# 默认为128K,这个参数不要设置过大,一般在128~256之间。
read_buffer_size = 1M

# 该参数用于表的随机读取,表示每个线程分配的缓冲区大小。
# 比如,按照一个非索引字段做order by排序操作时,就会利用这个缓冲区来暂存读取的数据。
# 默认为256KB,这个参数不要设置过大,一般在128~512KB。
read_rnd_buffer_size = 512K

# 当对MyISAM表执行repair table或创建索引时,用以缓存排序索引;设置太小时可能会遇到” myisam_sort_buffer_size is too small”
myisam_sort_buffer_size = 16M

# 线程池,线程缓存。用来缓存空闲的线程,以至于不被销毁,如果线程缓存在的空闲线程,需要重新建立新连接,则会优先调用线程池中的缓存,很快就能响应连接请求。
# 每建立一个连接,都需要一个线程与之匹配。
thread_cache_size = 32

# 查询缓冲大小
# 缓存select语句和结果集大小的参数。
# 查询缓存会存储一个select查询的文本与被传送到客户端的相应结果。
# 如果之后接收到一个相同的查询,服务器会从查询缓存中检索结果,而不是再次分析和执行这个同样的查询。
# 如果你的环境中写操作很少,读操作频繁,那么打开query_cache_type=1,会对性能有明显提升。
# 如果写操作频繁,则应该关闭它(query_cache_type=0)。
query_cache_size = 32M

# 指定单个查询能够使用的缓冲区大小,缺省为1M
query_cache_limit = 4M

# 临时HEAP数据表的最大长度(默认设置是32M); 超过这个长度的临时数据表将被转换为MyISAM数据表并存入一个临时文件。
tmp_table_size = 64M

# 设定默认的事务隔离级别
transaction_isolation = REPEATABLE-READ

# 线程使用的堆大小. 此值限制内存中能处理的存储过程的递归深度和SQL语句复杂性,此容量的内存在每次连接时被预留.
thread_stack = 512K

# 指定一个请求的最大连接时间
wait_timeout = 10

# 是否显示默认时间戳。
explicit_defaults_for_timestamp = true

# 该参数用来设置最大连接数,告诉你当前你的服务器允许多少并发连接。
# 默认为100,一般设置为512-1000即可。请记住,太多的连接会导致内存的使用量过高并且会锁住你的 MySQL 服务器。
# 一般小网站需要 100-200 的连接数,而较大可能需要 500-800 甚至更多。这里的值很大程度上取决于你 MySQL/MariaDB 的使用情况。
max_connections = 500

# 每个客户端连接最大的错误允许数量,当超过该次数,MYSQL服务器将禁止此主机的连接请求,直到MYSQL服务器重启或通过flush hosts命令清空此主机的相关信息
# 如果有时网络抽风,或者应用配置错误,或者其他原因导致客户端短时间内不断的尝试连接,客户端可能会被列入黑名单,然后将无法连接,直到再次刷新主机缓存。
# 这个选项默认值太小了,可以考虑设的足够大(如果你的服务器配置够强大的话)。
max_connect_errors = 100

# mysql打开最大文件数
open_files_limit = 65535

# 是操作系统在监听队列中所能保持的连接数
back_log = 300


# 开启二进制日志功能,若不指定路径则默认和数据存放在同一目录,生产环境强烈建议将MySQL日志和数据分开存放。
log-bin=mysql-bin

# 指定默认的二进制日志格式。
binlog_format=mixed

# 给服务器分配一个独一无二的ID编号; n的取值范围是1~2的32次方启用二进制日志功能。在复制数据同步的时候会用到,Helloweba后面会有文章介绍。
server-id = 1

# 启用二进制日志后,保留日志的天数。服务器会自动清理指定天数前的日志文件,如果不设置则会导致服务器空间耗尽。一般设置为7~14天。
expire_logs_days = 10

# 用 InnoDB 作为默认引擎
# 新数据表的默认存储引擎(默认设置是MyISAM)。这项设置还可以通过–default-table-type选项来设置。
default_storage_engine = InnoDB

# 打开独立表空间
# InnoDB 提供了更灵活的方式,它把每个数据库的信息保存在一个 .ibd 数据文件中。每个 .idb 文件代表它自己的表空间。
# 通过这样的方式可以更快地完成类似 “TRUNCATE” 的数据库操作,当删除或截断一个数据库表时,你也可以回收未使用的空间。
# 这样配置的另一个好处是你可以将某些数据库表放在一个单独的存储设备。这可以大大提升你磁盘的 I/O 负载。
innodb_file_per_table = 1

# InnoDB主目录,所有与InnoDB数据表有关的目录或文件路径都相对于这个路径。在默认的情况下,这个主目录就是MySQL的数据目录。
innodb_data_home_dir = /data/mysql

# 用来容纳InnoDB为数据表的表空间: 可能涉及一个以上的文件; 每一个表空间文件的最大长度都必须以字节(B)、兆字节(MB)或千兆字节(GB)为单位给出;
# 表空间文件的名字必须以分号隔开; 最后一个表空间文件还可以带一个autoextend属性和一个最大长度(max:n)
innodb_data_file_path = ibdata1:10M:autoextend

# 用来存放InnoDB日志文件的目录路径(如ib_logfile0、ib_logfile1等)。在默认的情况下,InnoDB驱动程序将使用 MySQL数据目录作为自己保存日志文件的位置。
innodb_log_group_home_dir = /data/mysql

# InnoDB使用一个缓冲池来保存索引和原始数据, 可设置这个变量到服务器物理内存大小的80%
# 这个参数是InnoDB存储引擎的核心参数,默认为128KB,这个参数要设置为物理内存的60%~70%。
innodb_buffer_pool_size = 256M

# 在InnoDb核心内的允许线程数量,建议的设置是CPU数量加上磁盘数量的两倍
innodb_thread_concurrency = 16

# 在日志组中每个日志文件的大小
# 事务日志文件写操作缓存区的最大长度(默认设置是1MB)。
innodb_log_file_size = 64M

# 用来缓冲日志数据的缓冲区的大小
# 事务日志所使用的缓存区。InnoDB在写事务日志的时候,为了提高性能,先将信息写入Innodb Log Buffer中,
# 当满足innodb_flush_log_trx_commit参数所设置的相应条件(或者日志缓冲区写满)时,再将日志写到文件(或者同步到磁盘)中。
# 可以通过innodb_log_buffer_size参数设置其可以使用的最大内存空间。
# 默认是8MB,一般为16~64MB即可。
innodb_log_buffer_size = 8M

# 在日志组中的文件总数
innodb_log_files_in_group = 3

# 这个选项决定着什么时候把日志信息写入日志文件以及什么时候把这些文件物理地写(术语称为”同步”)到硬盘上。
# 设置值0的意思是每隔一秒写一次日 志并进行 同步,这可以减少硬盘写操作次数,但可能造成数据丢失;
# 设置值1(设置设置)的意思是在每执行完一条COMMIT命令就写一次日志并进行同步,这可以防止数据丢失,但硬盘写操作可能会很频繁;
# 设置值2是一般折衷的办法,即每执行完一条COMMIT命令写一次日志,每隔一秒进行一次同步。
innodb_flush_log_at_trx_commit = 1

# SQL语句在被回滚前,InnoDB事务等待InnoDB行锁的时间
# 如果某个事务在等待n秒(s)后还没有获得所需要的资源,就使用ROLLBACK命令放弃这个事务。
# 这项设置对于发现和处理未能被InnoDB数据表驱动 程序识别出来的死锁条件有着重要的意义。这个选项的默认设置是50s。
innodb_lock_wait_timeout = 50

# 慢查询时长
long_query_time = 2

# 将没有使用索引的查询也记录下来
log-queries-not-using-indexes

# 指定服务端默认字符集
character-set-server=utf8mb4

[mysqldump]
quick
max_allowed_packet = 16M

[mysql]
# 指定客户端默认字符集
default-character-set=utf8mb4

# 不适用自动补全
no-auto-rehash

[myisamchk]
key_buffer_size = 64M
sort_buffer_size = 1M
read_buffer = 2M
write_buffer = 2M

[mysqlhotcopy]
interactive-timeout
eof
启动 mariadb

1.复制 support-files/systemd/ 目录下的 mariadb.service 到 /usr/lib/systemd/system/ 目录下:

1
cp support-files/systemd/mariadb.service /usr/lib/systemd/system/

2.执行 systemctl daemon-reload 加载下启动脚本:

1
systemctl daemon-reload

3.启动 mariadb:

1
systemctl start mariadb.service && systemctl enable mariadb.service

4.启动后,确保有监听 3306 端口,否则启动失败,执行 journalctl -xe 进行调试。

1
2
3
[root@VM-8-3-centos mysql]# ss -lntp |egrep 3306
LISTEN 0 128 0.0.0.0:3306 0.0.0.0:* users:(("mariadbd",pid=77450,fd=23))
LISTEN 0 128 [::]:3306 [::]:* users:(("mariadbd",pid=77450,fd=24))
配置环境变量

1.安装完成,是无法执行 mysql 命令的,这是因为还未将 mysql 加入到系统环境变量。编辑 /etc/profile 文件,在文件最后加入一行配置:

1
echo 'PATH=$PATH:/usr/local/mysql/bin' >> /etc/profile && . !$