MariaDB

来自 Arch Linux 中文维基

MariaDB 是一个可靠的、高性能的、功能全面的数据库,旨在为用户提供长期免费、向下兼容能直接替代MySQL的数据库服务。自2013年起,MariaDB就被Arch Linux当作官方默认的MySQL实现[1]

安装[编辑 | 编辑源代码]

Archlinux 选择的 MySQL 默认实现被称为 MariaDB

安装 mariadbmariadb-libs

提示:
  • 如果数据库 (位于 /var/lib/mysql) 运行在 Btrfs 分区之上, 你应当在创建数据库之前禁用 Copy-on-Write 特性。
  • 如果数据库运行在 ZFS 分区之上, 你应该在创建数据库之前参阅 ZFS#Databases

安装 mariadb 软件包之后,你必须在启动 mariadb.service 之前运行下面这条命令:

# mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql

然后 enable 或者 start mariadb.service

提示:如果数据目录使用的不是 /var/lib/mysql,需要在 /etc/my.cnf.d/server.cnf 文件的 [mysqld] 部分设置 datadir=<数据目录>

配置[编辑 | 编辑源代码]

启动 mariadb 服务器,并添加 root 维护帐号后,可以登录服务器进行进一步配置:

  1. mariadb -u root -p
注意: 默认密码为空,直接敲回车键登录

添加新用户[编辑 | 编辑源代码]

以下是创建一个密码为'some_pass'的'monty'用户的示例,并赋予 mydb 完全操作权限:

$ mariadb -u root -p
MariaDB> CREATE USER 'monty'@'localhost' IDENTIFIED BY 'some_pass';
MariaDB> GRANT ALL PRIVILEGES ON mydb.* TO 'monty'@'localhost';
MariaDB> quit

配置文件[编辑 | 编辑源代码]

MariaDB 会按照以下顺序读取配置文件 (根据 mysqld --help --verbose | tail -20 的输出):

/etc/my.cnf /etc/my.cnf.d/ ~/.my.cnf

请根据需要的作用范围(对系统, 对用户...)修改对应的配置文件。 点击这里了解更多信息。

启用自动补全[编辑 | 编辑源代码]

注意: 启用这项功能会增加客户端启动时间。

MySQL 默认禁用客户端自动补全功能。要在整个系统中启用它,编辑 /etc/my.cnf.d/mysql-clients.cnf,在mysql下 添加 auto-rehash。注意:不要将auto-rehash写在mysqld下,下次客户端启动时就会启用自动补全。

使用 UTF8MB4[编辑 | 编辑源代码]

警告: 在改变字符集之前务必先创建备份!
注意: mariadb 包已经使用 utf8mb4 作为字符集且使用 utf8mb4_unicode_ci 作为校对规则. 使用默认(字符集)设置的用户可以跳过本节。
  • 推荐使用UTF8MB4而不是UTF-8,因为它允许完整的Unicode支持 [2] [3].

将以下内容追加/etc/my.cnf.d/my.cnf文件中:

[client]
default-character-set = utf8mb4

[mariadb]
collation_server = utf8mb4_unicode_ci
character_set_server = utf8mb4

[mariadb-client]
default-character-set = utf8mb4

重启 mariadb.service 以应用更改。更改字符集不会改变现有表格格式,只会影响新创建的表格以及检索数据的协议交互。

参见#Maintenance 以优化和检查数据库健康状况。

使用内存作为临时文件存放点[编辑 | 编辑源代码]

MySQL 存储临时文件的目录名是 tmpdir

创建一个临时目录:

# mkdir -pv /var/lib/mysqltmp
# chown mysql:mysql /var/lib/mysqltmp

通过命令找出 mysql 的id和gid:

$ id mysql
uid=27(mysql) gid=27(mysql) groups=27(mysql)

添加 tmpfs/etc/fstab 中。

 tmpfs   /var/lib/mysqltmp   tmpfs   rw,gid=27,uid=27,size=100M,mode=0750,noatime   0 0

将以下配置添加到 /etc/mysql/my.cnfmysqld 组下:

 tmpdir      = /var/lib/mysqltmp

Stop mariadb.service, mount /var/lib/mysqltmp/启动 mariadb.service.

Time zone tables[编辑 | 编辑源代码]

Although time zone tables are created during the installation, they are not automatically populated. They need to be populated if you are planning on using CONVERT_TZ() in SQL queries.

To populate the time zone tables with all the time zones:

$ mariadb-tzinfo-to-sql /usr/share/zoneinfo | mariadb -u root -p mysql

Optionally, you may populate the table with specific time zone files:

$ mariadb-tzinfo-to-sql timezone_file timezone_name | mariadb -u root -p mysql

安全[编辑 | 编辑源代码]

提高初始的安全性[编辑 | 编辑源代码]

使用 mariadb-secure-installation 命令会交互式地引导您完成一些推荐的安全措施,比如移除匿名账户和测试数据库,从而提高初始安全性。

# mariadb-secure-installation
警告: 运行之后,请注意TCP端口3306仍将保持打开状态,但会拒绝连接并显示错误消息。要防止MySQL监听外部接口,请参阅#仅在回环地址上监听#仅通过Unix套接字本地访问的部分。

只监听本地回环地址[编辑 | 编辑源代码]

默认情况下, MariaDB 会监听 0.0.0.0 这个地址, 它包括了所有的网络接口。 为了限制 MariaDB 只监听回环地址, 请在 /etc/my.cnf.d/server.cnf文件中添加如下行:

[mariadb]
bind-address = localhost

这将绑定到地址 127.0.0.1 和 ::1,并使 MariaDB 能够接收 IPv4 和 IPv6 的连接。

启用仅通过 Unix 套接字在本地启用访问[编辑 | 编辑源代码]

By default, MariaDB is accessible via both Unix sockets and the network. If MariaDB is only needed for the localhost, you can improve security by not listening on TCP port 3306, and only listening on Unix sockets instead. To do this, add the following line in

默认情况下,MariaDB 可通过 Unix sockets 和网络访问。如果只需要在本地主机上使用 MariaDB,则可以通过不在 TCP 端口 3306 上监听,而是仅在 Unix sockets 上监听来提高安全性。要实现这一点,请在/etc/my.cnf.d/server.cnf文件中添加以下行:

[mariadb]
skip-networking

您仍然可以像以前一样在本地登录,但只能使用 Unix 套接字。

授权远程访问[编辑 | 编辑源代码]

警告: 这不被视为最佳实践,因为可能会引起安全问题。如果你想要从网络内/外的另一台主机上管理 MariaDB 服务器,请考虑使用安全外壳协议(Secure Shell),虚拟网络计算机(VNC)虚拟专用网络(VPN)

要允许远程访问MariaDB服务器,请确保MariaDB已启用网络正在适当的接口上进行侦听.

授予任何MariaDB用户远程访问权限(以root用户为例):

# mariadb -u root -p

检查当前具有远程访问权限特权的用户:

SELECT User, Host FROM mysql.user WHERE Host <> 'localhost';

现在为您的用户(这里是 root)授予远程访问权限:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'192.168.1.%' IDENTIFIED BY 'my_optional_remote_password' WITH GRANT OPTION;

如果愿意,您可以将“%”通配符更改为特定的主机。密码可以与用户的主密码不同。

配置主目录访问[编辑 | 编辑源代码]

注意: 出于安全考虑,systemd 的 .service 文件通过 ProtectHome=true 禁止 MariaDB 访问 /home/root/run/user 目录内的文件。datadir 必须要放在以上文件夹之外,并且由 mysql 用户和用户组 所有。 如果要改变这个设置,可以根据以下链接创建一个替代的 service 文件:[4]

维护[编辑 | 编辑源代码]

升级[编辑 | 编辑源代码]

mariadb大版本升级的时候(例如 mariadb-10.3.10-1 到 mariadb-10.9.4-1),最好更新一下数据库:

# mariadb-upgrade -u root -p

要从 10.3.x 更新到 10.9.x:

  • 停止 10.3.x 服务器
  • 更新软件包
  • 启动新服务并用执行新软件包的 mariadb_upgrade

如果新服务未启动,请参考 MariaDB 未启动,无法执行 mariadb_upgrade。

备份[编辑 | 编辑源代码]

有各种各样的工具和策略可以备份你的数据库。

如果你正在使用默认的 InnoDB 存储引擎,建议的在线备份所有数据库并为时序恢复(也称为“向前滚动”,当你需要恢复旧备份并重放自那个备份以来发生的更改时)的方法是执行以下命令:

$ mariadb-dump --single-transaction --flush-logs --events --routines --master-data=2 --all-databases -u root -p > all_databases.sql

这将提示输入 MariaDB 的 root 用户密码,该密码是在数据库配置期间定义的。

强烈建议不在命令行中指定密码,因为这会使密码通过 ps aux 或其他技术暴露给其他用户发现。相反,上述命令会提示输入指定用户的密码,并将其隐藏起来。

Compression[编辑 | 编辑源代码]

As SQL tables can get pretty large, it is recommended to pipe the output of the aforementioned command in a compression utility like gzip:

$ mariadb-dump --single-transaction --flush-logs --events --routines --master-data=2 --all-databases -u root -p | gzip > all_databases.sql.gz

Decompressing the backup thus created and reloading it in the server is achieved by doing:

$ zcat all_databases.sql.gz | mariadb -u root -p

This will recreate and repopulate all the databases previously backed up (see this or this).

Non-interactive[编辑 | 编辑源代码]

If you want to setup non-interactive backup script for use in cron jobs or systemd timers, see option files and this illustration for mariadb-dump.

Basically you should add the following section to the relevant configuration file:

[mariadb-dump]
user=mysqluser
password=secret

Mentioning a user here is optional, but doing so will free you from having to mention it on the command line. If you want to set this for all tools, including mariadb-client, use the [client] group.

Example script[编辑 | 编辑源代码]

The database can be dumped to a file for easy backup. The following shell script will do this for you, creating a db_backup.gz file in the same directory as the script, containing your database dump:

#!/bin/sh

THISDIR=$(dirname $(readlink -f "$0"))

mariadb-dump --single-transaction --flush-logs --events --routines --master-data=2 --all-databases \
 | gzip > $THISDIR/db_backup.gz
echo 'purge master logs before date_sub(now(), interval 7 day);' | mariadb

See also the official mariadb-dump page in the MariaDB manuals.

Holland Backup[编辑 | 编辑源代码]

A python-based software package named Holland Backup is available in AUR to automate all of the backup work. It supports direct mysqldump, LVM snapshots to tar files (mysqllvm), LVM snapshots with mysqldump (mysqldump-lvm), and xtrabackup methods to extract the data. The Holland framework supports a multitude of options and is highly configurable to address almost any backup situation.

The main hollandAUR and holland-commonAUR packages provide the core framework; one of the sub-packages (holland-mysqldumpAUR, holland-mysqllvmAUR and/or holland-xtrabackupAUR must be installed for full operation. Example configurations for each method are in the /usr/share/doc/holland/examples/ directory and can be copied to /etc/holland/backupsets/, as well as using the holland mk-config command to generate a base configuration for a named provider.

故障排除[编辑 | 编辑源代码]

执行 mysql_upgrade 后 MySQL 不能启动[编辑 | 编辑源代码]

试试安全模式下运行的 MySQL:

# mariadbd-safe --datadir=/var/lib/mysql/

然后再运行:

# mariadb-upgrade -u root -p

重置 root 密码[编辑 | 编辑源代码]

  1. 停止 mariadb.service.
  2. 用安全方式启动服务:
    # mariadbd-safe --skip-grant-tables --skip-networking &
  3. 连接服务器:
    # mariadb -u root
  4. 修改 root 密码:
    MariaDB [mysql]> FLUSH PRIVILEGES;
    MariaDB [mysql]> ALTER USER 'root'@'localhost' IDENTIFIED BY 'new_password';
    MariaDB [mysql]> exit
    
  5. 停掉 mariadbd* 进程:
    # kill $(cat /var/lib/mysql/$HOSTNAME.pid)
  6. 启动 mariadb.service.

检查并修复所有数据表[编辑 | 编辑源代码]

检查并自动修复所有数据库中的所有表,查看更多

# mariadb-check -A --auto-repair -u root -p

优化所有数据表[编辑 | 编辑源代码]

强制优化所有数据表,自动修复可能出现的数据表错误

# mariadb-check -A --auto-repair -f -o -u root -p

OS error 22 when running on ZFS[编辑 | 编辑源代码]

如果您正在使用 ZFS 并且遇见了如下错误

InnoDB: Operating system error number 22 in a file operation.

那么就需要修改 /etc/mysql/my.cnf 中的设置来禁用 aio_writes

[mariadb]
...
innodb_use_native_aio = 0

无法通过命令行登录, 但是 phpmyadmin 正常工作[编辑 | 编辑源代码]

当使用了超长 (>70-75) 的密码后,这个问题有可能发生。 mariadb 的命令行不能在 readline 模式中处理那么多的字符。 所以如果打算使用推荐的密码输入方式:

$ mariadb -u user -p
Password:

不妨考虑更换一个长度短一点的密码。

注意: 您依然可以通过在命令行参数中指定密码来登录
$ mysql -u <user> -p"some-very-strong-password"
警告: 但这样做很危险,因为您的密码很可能会泄漏到某个地方,例如,日志。只有当遇到紧急情况才能考虑这么做,并且事后不要忘记更改密码。

MySQL 日志文件占用太多空间[编辑 | 编辑源代码]

默认情况下, mysqld 会在 /var/lib/mysql 下创建二进制日志文件。这在某些场景下是很有用的。但是这些日志文件也可能耗光您的硬盘空间。如果需要,您可以在 /etc/mysql/my.cnf 中注释掉以下两行来禁用日志:

#log-bin=mysql-bin
#binlog_format=mixed

或者限制 logfile 的大小:

OpenRC fails to start MariaDB[编辑 | 编辑源代码]

To use MariaDB with OpenRC you need to add the following lines to the [mariadb] section in the MySQL configuration file, located at /etc/my.cnf.d/my.cnf.

user = mysql
basedir = /usr
datadir = /var/lib/mysql
pid-file = /run/mysqld/mysql.pid

You should now be able to start MariaDB using:

# rc-service mysql start

Specified key was too long[编辑 | 编辑源代码]

See #Increase character limit.

Changed limits warning on max_open_files/table_open_cache[编辑 | 编辑源代码]

Increase the number of file descriptors by creating a systemd drop-in, e.g.:

/etc/systemd/system/mariadb.service.d/limit_nofile.conf
[Service]
LimitNOFILE=8192

10.4 to 10.5 upgrade crash: "InnoDB: Upgrade after a crash is not supported. The redo log was created with MariaDB 10.4.x"[编辑 | 编辑源代码]

Before MariaDB 10.5, redo log was unnecessarily split into multiple files.[5]

Do NOT ever remove the old binary logs /var/lib/mysql/ib_logfile* out of the way.

To resolve this, install MariaDB 10.4. Start it and let it undergo a clean shutdown. After that happens you can upgrade to 10.5 again. Same applies if another version of MariaDB was specified.

Table 'mysql.xxx' does not exist in engine[编辑 | 编辑源代码]

Symptom: When running mariadb-upgrade or mariadb-check, it return one or more error like these:

Table 'mysql.xxx' does not exist in engine

Where "xxx" usually is the system table inside the mysql database.

Steps to fix this,

  1. Create backup directory outside of MariaDB ${DATADIR}</nowiki>, for example in $HOME/mariadb_backup.
  2. Copy the offending files from ${DATADIR}/mysql/xxx.{frm,ibd}</nowiki> to backup directory. The xxx.ibd may not exist.
  3. Drop the tables with DROP TABLE mysql.xxx on the mariadb prompt.
  4. Run the mariadb-check. On success, the file xxx.frm and xxx.ibd should be created again.
  5. Re-run mariadb-upgrade if necessary. You may need the --force option.
expire_logs_days = 10
max_binlog_size  = 100M

另外,您也可以执行以下命令来清除 /var/lib/mysql 里的一些日志文件来释放硬盘空间:

#mysql -u root -p"PASSWORD" -e "PURGE BINARY LOGS TO 'mysql-bin.0000xx';"

更多资源[编辑 | 编辑源代码]