安装MariaDB

MariaDB是开源关系型数据库,和MySQL兼容并且用于替代MySQL。这是因为Oracle收购了SUN公司之后拥有了MySQL,潜在影响了MySQL开源。所以MySQL社区基于原先MySQL fork出了新的开源项目MariaDB,并得到了众多Linux发行版支持。从CentOS 7开始,MiriaDB已经取代了MySQL作为默认数据库系统。

快速起步

实际上在CentOS上安装部署并启动MariaDB只有3条命令,所以可以快速完成:

快速安装、启动和初始化MariaDB
sudo yum -y install mariadb-server
sudo systemctl enable --now mariadb
sudo /usr/bin/mysql_secure_installation

安装

  • 执行以下命令安装:

在CentOS上安装 MariaDB
sudo yum -y install mariadb-server

建议同时安装 mariadbmariadb-devel 软件包,方便后续开发

使用MariaDB官方仓库安装(推荐)

CentOS 7操作系统通过EPEL安装mariadb,需要注意EPEL提供的mariadb的版本很低,和最新的版本不兼容,带来很多开发移植上的不变。所以,我建议不要使用EPEL提供的版本,而是采用 MariaDB官方软件仓库 安装。即将网站提供的 MariaDB.repo 存放到 /etc/yum.repos.d 目录下。例如这里使用国内的阿里云镜像:

/etc/yum.repo.d/MariaDB.repo 配置阿里云镜像仓库(MariaDB 11.1)
#cat MariaDB.repo
# MariaDB 11.1 CentOS repository list - created 2023-09-20 08:31 UTC
# https://mariadb.org/download/
[mariadb]
name = MariaDB
# rpm.mariadb.org is a dynamic mirror if your preferred mirror goes offline. See https://mariadb.org/mirrorbits/ for details.
# baseurl = https://rpm.mariadb.org/11.1/centos/$releasever/$basearch
baseurl = https://mirrors.aliyun.com/mariadb/yum/11.1/centos/$releasever/$basearch
module_hotfixes = 1
# gpgkey = https://rpm.mariadb.org/RPM-GPG-KEY-MariaDB
gpgkey = https://mirrors.aliyun.com/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck = 1

我实际选择了一个低版本 MariaDB 10.11:

/etc/yum.repo.d/MariaDB.repo 配置阿里云镜像仓库(MariaDB 10.11)
# MariaDB 10.11 CentOS repository list - created 2023-09-20 08:46 UTC
# https://mariadb.org/download/
[mariadb]
name = MariaDB
# rpm.mariadb.org is a dynamic mirror if your preferred mirror goes offline. See https://mariadb.org/mirrorbits/ for details.
# baseurl = https://rpm.mariadb.org/10.11/centos/$releasever/$basearch
baseurl = https://mirrors.aliyun.com/mariadb/yum/10.11/centos/$releasever/$basearch
module_hotfixes = 1
# gpgkey = https://rpm.mariadb.org/RPM-GPG-KEY-MariaDB
gpgkey = https://mirrors.aliyun.com/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck = 1
  • 执行安装:

安装MariaDB
sudo yum install MariaDB-server MariaDB-client MariaDB-devel

这里有一个报错:

安装MariaDB报错显示缺少 libpcre2-8.so.0
Error:
 Problem 1: cannot install the best candidate for the job
  - nothing provides libpcre2-8.so.0()(64bit) needed by MariaDB-server-11.1.2-1.el7.centos.x86_64
 Problem 2: cannot install the best candidate for the job
  - nothing provides libpcre2-8.so.0()(64bit) needed by MariaDB-client-11.1.2-1.el7.centos.x86_64

这个 libpcre2-8.so.0pcre2 提供,aliOS 7.2系统默认只有 pcre 。这个软件包其实在CentOS 7.9社区版本是具备的,但是很不幸这里没有

centos.pkgs.org 可以搜索到 pcre2-10.23-2.el7.x86_64.rpm 但是我看到这个二进制库依赖 glibc 2.2.5 比系统 glibc 2.17 要高,不确定是否兼容。在 valut.centos.org 搜索可以看到 pcre2 软件包是 CentOS 7.4 引入的:

安装 pcre2 rpm
rpm -ivh https://vault.centos.org/7.4.1708/os/x86_64/Packages/pcre2-10.23-2.el7.x86_64.rpm

然后再次执行安装 MariaDB 就能够成功

  • 启动数据库:

启动MariaDB
sudo sytemctl enable --now mariadb

手工启动数据库

备注

如果直接使用上文操作系统发行版安装MariaDB数据库,则已经自动初始化数据库了。无需本段手工初始化和手工启动,本段落只适用于需要重建数据库的情况。

  • 首先初始化系统数据库目录和系统表:

    sudo -u mysql mysql_install_db
    

默认数据库位于 /var/lib/mysql

  • 启动数据库:

    /usr/bin/mysqld_safe
    
  • 通过 mysqld_safe 启动启动的数据库可以通过 mysqladmin 关闭:

    mysqladmin shutdown
    

启动数据库报错排查

我遇到一个问题,发现数据库启动失败, /var/log/mariadb/mariadb.log 记录:

210207 14:16:06 [ERROR] mysqld: Can't find file: './mysql/plugin.frm' (errno: 13)
210207 14:16:06 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
210207 14:16:06 [Note] Server socket created on IP: '0.0.0.0'.
210207 14:16:06 [ERROR] mysqld: Can't find file: './mysql/host.frm' (errno: 13)
210207 14:16:06 [ERROR] Fatal error: Can't open and lock privilege tables: Can't find file: './mysql/host.frm' (errno: 13)
210207 14:16:06 mysqld_safe mysqld from pid file /var/run/mariadb/mariadb.pid ended

但是,前面执行 mysql_install_db 实际上已经创建了 /var/lib/mysql/ 目录并存储了数据库文件在 /var/lib/mysql/mysql/host.frm

实际上仔细查看了文件权限发现,原来 mysql_install_db 命令必须使用 mysql 用户来执行,否则创建的 /var/lib/mysql/mysql 目录以及该目录下文件都是属于root用户的。不过,mysql用户账号默认是 nologin ,所以需要使用 sudo -u mysql 方式来运行。

升级数据库

我之前使用了CentOS(aliOS 7.2)发行版自带的低版本MariaDB 5.5,重新安装了社区版本10.11,虽然能够运行,但是启动日志中提示需要升级系统表。所以我执行了一次 升级MariaDB

数据库安全加固

  • 使用 root 用户身份登陆系统,执行以下数据库默认安全加固脚本:

执行初始化安全加固( 重要操作 )
/usr/bin/mysql_secure_installation

上述脚本命令也可以直接手工执行:

'/usr/bin/mysqladmin' -u root password 'new-password'
'/usr/bin/mysqladmin' -u root -h `hostname` password 'new-password'

备注

在MariaDB的高版本中默认安全策略只允许操作系统的 root 用户执行上述 mysql_secure_installation 安全加固脚本,以便首次以无密码方式登陆mysql的root账号。

创建数据库及授权

  • 快速创建一个数据库并创建访问账号及授权:

创建一个数据库并创建访问账号及授权
create database mydb character set utf8;
grant usage on mydb.* to myapp_user@'%' identified by 'myapp_passwd';
grant all privileges on mydb.* to myapp_user@'%';
flush privileges;

从MySQL 8.0开始,默认字符集是 utf8mb4_0900_ai_ci

  • 此时可以在自定义 MySQL配置文件 my.cnf 文件 ~/.my.cnf 配置好访问账号,就能够简单执行 mysql 命令访问:

用户个人目录下 ~/.my.cnf 配置访问账号
[client]
user=myapp_user
password=myapp_passwd
host=localhost

[mysql]
database=mydb

参考