安装MariaDB¶
MariaDB是开源关系型数据库,和MySQL兼容并且用于替代MySQL。这是因为Oracle收购了SUN公司之后拥有了MySQL,潜在影响了MySQL开源。所以MySQL社区基于原先MySQL fork出了新的开源项目MariaDB,并得到了众多Linux发行版支持。从CentOS 7开始,MiriaDB已经取代了MySQL作为默认数据库系统。
快速起步¶
实际上在CentOS上安装部署并启动MariaDB只有3条命令,所以可以快速完成:
sudo yum -y install mariadb-server
sudo systemctl enable --now mariadb
sudo /usr/bin/mysql_secure_installation
安装¶
执行以下命令安装:
sudo yum -y install mariadb-server
建议同时安装 mariadb
和 mariadb-devel
软件包,方便后续开发
使用MariaDB官方仓库安装(推荐)¶
CentOS 7操作系统通过EPEL安装mariadb,需要注意EPEL提供的mariadb的版本很低,和最新的版本不兼容,带来很多开发移植上的不变。所以,我建议不要使用EPEL提供的版本,而是采用 MariaDB官方软件仓库 安装。即将网站提供的 MariaDB.repo
存放到 /etc/yum.repos.d
目录下。例如这里使用国内的阿里云镜像:
#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:
# 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
执行安装:
sudo yum install MariaDB-server MariaDB-client MariaDB-devel
这里有一个报错:
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.0
是 pcre2
提供,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 引入的:
rpm -ivh https://vault.centos.org/7.4.1708/os/x86_64/Packages/pcre2-10.23-2.el7.x86_64.rpm
然后再次执行安装 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
命令访问:
[client]
user=myapp_user
password=myapp_passwd
host=localhost
[mysql]
database=mydb