记一次CentOS中安装 MariaDB 10.6.8 的踩坑经历

1 背景

新购了一个工业微型计算机,无风扇、可7*24h运行的那种,于是打算装个linux,做一下科研工作。本身也是初学linux,以前用虚拟机跑过CentOS,也经过比选,据说稳定,最终操作系统还是选它。考虑要尽快上手,本身对MySQL比较熟悉,但目前来看,MySQL在Oracle下有闭源的可能性,就选了MariaDB。CentOS 7.9 默认MariaDB yum 源版本较低(5.x),故打算从修改 yum 源开始。

操作系统:CentOS 7.9

数据库:MariaDB 10.6.8

2 yum安装MariaDB 10.6.8

2.1 添加MariaDB yum 源

CentOS 7.9 默认yum安装的版本如下。

$ yum info mariadb      
Loaded plugins: fastestmirror, product-id, search-disabled-repos, subscription-manager

This system is not registered with an entitlement server. You can use subscription-manager to register.

Loading mirror speeds from cached hostfile
Available Packages
Name       : mariadb
Arch       : x86_64
Epoch       : 1
Version     : 5.5.68
Release     : 1.el7
Size       : 8.8 M
Repo       : base/7/x86_64
Summary     : A community developed branch of MySQL
URL         : http://mariadb.org
License     : GPLv2 with exceptions and LGPLv2 and BSD
Description : MariaDB is a community developed branch of MySQL.
          : MariaDB is a multi-user, multi-threaded SQL database server.
          : It is a client/server implementation consisting of a server daemon (mysqld)
          : and many different client programs and libraries. The base package
          : contains the standard MariaDB/MySQL client programs and generic MySQL files

 

因为系统默认从阿里的yum源下载,没有提供较新的版本,此处需要手动添加源。

vim /etc/yum.repos.d/MariaDB.repo

[mariadb]

name = MariaDB

# URL可替换为想用的版本的URL
baseurl = http://yum.mariadb.org/10.6.8/centos7-amd64/

gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB

gpgcheck=1

版本URL可在此处找:http://yum.mariadb.org

重新构建缓存。

yum clean all
yum makecache  //此步骤是用刚才所编辑 MariaDB.repo 源的关键

2.2 卸载旧版

systemctl stop mariadb // 或者直接ps找出来kill掉

yum remove mariadb-server mariadb mariadb-libs

yum clean all

找出并删除残留目录。

$ find / -name mariadb     
$ find / -name mysql 

2.3 安装新版及启动数据库

yum install MariaDB-server

查看状态:

$ systemctl status mariadb
● mariadb.service - MariaDB 10.6.8 database server
  Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor preset: disabled)
Drop-In: /etc/systemd/system/mariadb.service.d
          └─migrated-from-my.cnf-settings.conf
  Active: inactive (dead)
    Docs: man:mariadbd(8)
          https://mariadb.com/kb/en/library/systemd/

此时说明已经安装成功,直接启动。

$ systemctl start mariadb

再次查看状态:

$ systemctl status mariadb
● mariadb.service - MariaDB 10.6.8 database server
   Loaded: loaded (/usr/lib/systemd/system/mariadb.service; disabled; vendor preset: disabled)
  Drop-In: /etc/systemd/system/mariadb.service.d
           └─migrated-from-my.cnf-settings.conf
   Active: active (running) since Fri 2022-06-10 10:15:34 CST; 3s ago
     Docs: man:mariadbd(8)
           https://mariadb.com/kb/en/library/systemd/
  Process: 22045 ExecStartPost=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
  Process: 22019 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= ||   VAR=`cd /usr/bin/..; /usr/bin/galera_recovery`; [ $? -eq 0 ]   && systemctl set-environment _WSREP_START_POSITION=$VAR || exit 1 (code=exited, status=0/SUCCESS)
  Process: 22017 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
 Main PID: 22031 (mariadbd)
   Status: "Taking your SQL requests now..."
    Tasks: 13
   Memory: 56.5M
   CGroup: /system.slice/mariadb.service
           └─22031 /usr/sbin/mariadbd

说明启动成功。

2.4 特别说明

MariaDB 10.6.8中(包括之前几个版本,至少是10.4.12之后的版本),user 已经不是 mysql 数据库下的表,而是一个视图,故无法直接修改。如下图所示。

 

 

 主要mysql中还有两个存储过程,作者表示理解不能。关于user的设置方法参考官网手册:

https://mariadb.com/kb/en/create-user/

https://mariadb.com/kb/en/set-password/

详细设置方法将在下一章介绍。

3 修改MariaDB数据存放路径

3.1 背景

因为所购工控计算机包括一个256GB的SSD,以及一个1TB的2.5英寸机械硬盘,打算将数据默认存放路径设在机械硬盘中。机器上的linux采用LVM(Logical Volume Manager)进行的分区管理,机械硬盘中有500GB挂载至 /opt,具体如下。

[root@192 ~]# lsblk
NAME            MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda               8:0    0 238.5G  0 disk 
├─sda1            8:1    0     1G  0 part /boot
└─sda2            8:2    0 207.8G  0 part 
  ├─centos-root 253:0    0   150G  0 lvm  /
  ├─centos-swap 253:1    0   7.8G  0 lvm  [SWAP]
  └─centos-var  253:2    0    50G  0 lvm  /var
sdb               8:16   0 931.5G  0 disk 
└─sdb1            8:17   0 931.5G  0 part 
  └─centos-opt  253:3    0   500G  0 lvm  /opt

考虑以后数据增加,故希望将数据存储位置修改至 /opt 下。

3.2 查看MariaDB数据当前存储位置

[root@192 ~]# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 10.6.8-MariaDB MariaDB Server

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> select @@datadir;+-----------------+
| @@datadir       |
+-----------------+
| /var/lib/mysql/ |
+-----------------+
1 row in set (0.000 sec)

(注意,此时执行 mysql 并未要求输入用户名和密码)。通过上述查询结果可知,数据存储位置在 /var/lib/mysql 目录下。

3.3 关闭连接MariaDB的相关程序

这是为了避免正在连接MariaDB的程序因连接中断而报错。

3.4 在期望位置创建数据存放目录(datadir)

mkdir /opt/data
mkdir /opt/data/mysql
chown -R mysql:mysql /opt/data/mysql

3.5 关闭mariadb服务

systemctl stop mariadb

3.6 复制目录文件至新目录

cp -Rp /var/lib/mysql/* /opt/data/mysql

3.7 修改MariaDB的config文件

默认情况下,mysql的config信息在 /etc/my.cnf 中,为了确认 MariaDB 的config信息未发生变化,先查询该文件。

[root@192 ~]# find / -name my.*
/etc/my.cnf
/etc/my.cnf.d

结果显示相较于mysql还是有变化,下面我们来看 /etc/my.cnf 中的内容。

#
# This group is read both by the client and the server
# use it for options that affect everything
#
[client-server]

#
# include *.cnf from the config directory
#
!includedir /etc/my.cnf.d

此处需添加一部分内容,如下。(此处若不添加,服务器外客户端将无法访问数据库)

#
# This group is read both by the client and the server
# use it for options that affect everything
#
[client-server]
port=3306
socket = /opt/data/mysql/mysql.sock
# # include
*.cnf from the config directory # !includedir /etc/my.cnf.d

另外,最后一行代码

!includedir /etc/my.cnf.d

表示包含 /etc/my.cnf.d 目录下的所有 *.cnf 文件。我们来看下 /etc/my.cnf.d 目录下包括哪些文件。

ls /etc/my.cnf.d/
enable_encryption.preset  mysql-clients.cnf  server.cnf  spider.cnf

其中有三个配置文件:mysql-clients.cnf、server.cnf、spider.cnf,其中 mysql-clients.cnf 用于配置客户端,我们不用管它,spider.cnf 也不相关,此目录下仅需要在 server.cnf 文件中配置:

server.cnf

#
# These groups are read by MariaDB server.
# Use it for options that only the server (but not clients) should see
#
# See the examples of server my.cnf files in /usr/share/mysql/
#

# this is read by the standalone daemon and embedded servers
[server]

# this is only for the mysqld standalone daemon
[mysqld]
datadir =/opt/data/mysql
socket = /opt/data/mysql/mysql.sock

......

3.8 开启数据库服务

systemctl start mariadb

3.9 验证

MariaDB [(none)]> select @@datadir;
+------------------+
| @@datadir        |
+------------------+
| /opt/data/mysql/ |
+------------------+
1 row in set (0.000 sec)

修改成功。

4 MariaDB设置用户及密码(解决无密码即登录问题)

前文所述 MariaDB v10.6.8 安装好之后不输入用户名和密码就能进入数据库查询,本章将示范如何完善密码设置。

4.1 查看当前认证状态并修改

select user, host, plugin from mysql.user;

若 root 显示为 unix_socket (系统认出是root直接认证)就需要修改模式,按照官网说明(https://mariadb.com/kb/en/authentication-plugin-unix-socket/)即可。

alter user root@localhost identified via mysql_native_password;

修改后再查询,状态如下。

MariaDB [mysql]> SELECT USER, host, PLUGIN FROM user;
+-------------+-----------+-----------------------+
| User        | Host      | plugin                |
+-------------+-----------+-----------------------+
| mariadb.sys | localhost | mysql_native_password |
| root        | localhost | mysql_native_password |
| mysql       | localhost | mysql_native_password |
+-------------+-----------+-----------------------+
3 rows in set (0.003 sec)

修改成功后发现还是可以通过 mysql 或 mysql -u root 命令直接进入。此时需要重新设置密码。即使从 mysql_native_password 模式变为 mysql_native_passoword 模式,也需要设置

4.2 重设密码

ALTER USER `root`@`localhost` IDENTIFIED BY 'yourpassword';

此时再尝试,如下图,则说明密码设置成功。

[root@192 ~]# mysql -u root
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)

5 外部访问数据库

若此时从外部通过客户端工具访问数据库,会出现连不上的情况。

Error “cannot connect to mysql server (10060)”

可能有多个原因(Error “cannot connect to mysql server (10060)” – Here’s how to fix it),笔者遇到的是其中两个原因:1)未在mysql.user视图中添加`root`@`%`用户域;2)未将3306端口列入服务器防火墙白名单。

5.1 在mysql.user视图中添加`root`@`%`用户域

GRANT ALL PRIVILEGES ON *.* TO `root`@`%` IDENTIFIED BY 'yourpassword' WITH GRANT OPTION;
MariaDB [mysql]> SELECT USER, host, PLUGIN FROM user;
+-------------+-----------+-----------------------+
| User        | Host      | plugin                |
+-------------+-----------+-----------------------+
| mariadb.sys | localhost | mysql_native_password |
| root        | localhost | mysql_native_password |
| mysql       | localhost | mysql_native_password |
| root        | %         | mysql_native_password |
+-------------+-----------+-----------------------+
4 rows in set (0.003 sec)

5.2 将3306端口列入服务器防火墙白名单

首先查看防火墙状态,如下图,表示开启。

systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri ...... CST; 23h ago
     Docs: man:firewalld(1)
 Main PID: 809 (firewalld)
   CGroup: /system.slice/firewalld.service
           └─809 /usr/bin/python2 -Es /usr/sbin/firewalld --nofork --nopid

# 查看白名单列表
firewall-cmd --zone=public --list-ports
#此处无3306/tcp
# 添加白名单端口 firewall-cmd --zone=public --add-port=3306/tcp --permanent # 重启防火墙 firewall-cmd --reload # 查看白名单列表 firewall-cmd --zone=public --list-ports
#表示3306端口已加入白名单
3306/tcp

关于防火墙的其它命令:

# 查看防火墙状态,是否是running
firewall-cmd --state

# 重新载入配置,比如添加规则之后,需要执行此命令                       
firewall-cmd --reload

# 列出支持的zone
firewall-cmd --get-zones

# 列出支持的服务,在列表中的服务是放行的
firewall-cmd --get-services

# 查看已开放的端口
firewall-cmd --zone=public --list-ports

# 永久添加80端口
firewall-cmd --add-port=3306/tcp --permanent

# 永久添加80端口
firewall-cmd --remove-port=3306/tcp --permanent 

命令说明:

# 作用域
--zone

# 添加端口
--add-port=3306/tcp

# 永久生效,没有此参数重启后失效
--permanent

 

参考文献:

[1]  CentOS安装新版本MariaDB

[2]  CentOS7下更改、移动mysql数据存储的位置(mariaDB适用)

[3]  解决MariaDB无密码可登录

[4]  Error “cannot connect to mysql server (10060)” – Here’s how to fix it

[5]  CentOS 7 端口白名单设置

posted @ 2022-06-11 04:45  之由  阅读(1242)  评论(0编辑  收藏  举报