MySQL
MySQL 是自由软件中最流行的关系型数据库服务器,原因很简单(虽然不是最好的技术原因):
- 它简单且非常易于使用
- 它与 SQLSERVER 非常相似,并且也用于其他系统中
在 Alpine Linux 的世界中,有一个软件可以提供它,那就是 MariaDB,这里我们简要介绍一下关于兼容性和差异的信息,但简而言之,没有太大的区别,如果您有疑问,请查看 此处的 MariaDB vs MySQL 部分
在 Wiki 中,有两种使用方法,专业的(用于服务器和部署)和 快速且简单 的用法(用于开发者和/或爱好者)
MariaDB - 快速且简单地使用
MariaDB 是 MySQL 关系数据库管理系统的社区开发分支,旨在根据 GNU GPL 保持自由。 它因由 MySQL 的原始开发者领导而闻名,他们因担心被 Oracle 收购而分叉了它。
安装
Alpine Linux 仓库不再包含实际的 MySQL 二进制文件,安装 mysql-*
软件包将改为安装 MariaDB。
安装 mariadb
将创建用户 mysql
。 当数据库初始化时,将向数据库添加两个用户:root
和 mysql
。 默认情况下,只有当您以相应的系统用户身份登录时,才能访问这些用户。
apk add mariadb mariadb-client
安装上述软件包会将 MariaDB 的主要组件添加到系统中:mariadb-cient
和 mariadb-server
。 下表描述了其他可用的软件包,并按生产服务器的相关性顺序列出。
MySQL 名称包 | 自 Alpine 版本 | 简要用法 | 相关软件包 |
---|---|---|---|
mysql | v2 | 安装 mariadb 的过渡软件包 | mariadb |
mysql-client | v2 | 安装 mariadb 客户端工具的过渡软件包 | mariadb-client |
mariadb | v2 | 服务器等效于 mysql-server | mariadb-common |
mariadb-client | v2 | 连接命令行和工具 | mariadb-common |
mariadb-doc | v3.0 | mariadb 的手册页 | man man-pages |
mariadb-connector-odbc | edge | 编码或建立操作系统级别连接,无需安装库即可连接到任何数据库 | . |
mariadb-connector-c | v3.8 | C 源代码上的编码连接 | mariadb-connector-c-dev |
mariadb-backup | v3.8 | 用于物理在线备份的工具,不再广泛使用 | . |
mariadb-server-utils | v3.8 | 服务器命令未广泛使用,过去在 MariaDB 软件包中 | . |
mariadb-dev | v3.1 | MariaDB 的开发文件 | . |
mariadb-test | v3.3 | 来自 MariaDB 工具的测试套件 | . |
mariadb-mytop | v3.9 | 数据性能监控 | . |
mariadb-plugin-rocksdb | v3.9 | 用于数据的纯键值事件关系 | . |
mariadb-static | v3.8 | 用于构建中静态非依赖链接的静态库 | . |
mariadb-embedded | v3.9 | libmysqld 与 C 客户端相同的接口 | mariadb-embedded-dev |
mariadb-embedded-dev | v3.9 | 使用普通的 mysql.h 并与 libmysqld 而不是 libmysqlclient 链接 | mariadb-dev |
mariadb-openrc | v3.8 | 单独的脚本,过去嵌入在服务器软件包中 | . |
初始化
Alpine 仓库中 MariaDB 的版本行为类似于 MySQL tarball。 不包含图形工具。
位于 /var/lib/mysql 的 datadir 必须由 mysql 用户和组拥有。 可以通过编辑 /etc/init.d 中的 mariadb
服务文件来更改 datadir 的位置。 新位置还需要通过在 mariadb 配置文件中的 [mysqld]
部分添加 datadir=<YOUR_DATADIR>
来设置。
可以按如下方式完成 mariadb 的正常初始化
- 启动主服务。 此时将不会设置 root 密码。
rc-service mariadb start
- 通过运行
mysql_secure_installation
来保护数据库安全 - 有关管理其他用户和数据库的设置权限,请参阅:配置
- 将 MariaDb 添加到 OpenRC。
rc-update add mariadb default
配置
为了帮助数据库引擎的基本配置,MariaDB 提供了 mariadb-secure-installation。
运行此脚本的许多原因不再必要,因为自 MariaDB 10.4 以来,MariaDB 默认使用 Unix 套接字身份验证。
此脚本将引导您完成保护数据库安全的基础知识。 选项如下所述。
- 输入 root 用户的当前密码(如果没有密码,请直接按回车): 如果您之前设置过 root 密码,请在此处提供并按回车。 如果没有,请直接按回车。
- 切换到 unix_socket 身份验证 [Y/n] 设置 root 密码或使用 Unix_socket 可确保只有管理员可以登录到引擎数据库。 对于非生产服务器,只需按“n”来设置 root 密码,这将给您响应
... skipping.
- 更改 root 密码? [Y/n] 在这里您可以更改 root 密码,或者在需要时设置一个。 按“Y”并输入新密码。
- 删除匿名用户? [Y/n] 删除为使用套接字身份验证登录而创建的匿名用户。 除非您确定需要此功能,否则请回答“Y”以删除它们。
- 禁止 root 用户远程登录? [Y/n] 通常,为了防止通过网络进行密码嗅探尝试,应仅允许 root 用户从“localhost”连接。 回答“Y”。
- 删除测试数据库并禁止对其的访问? [Y/n] 默认情况下,MariaDB 附带一个名为“test”的数据库,任何人都可以访问。 如果不需要,请回答“Y”。
- 现在重新加载权限表? [Y/n] 重新加载权限表将确保到目前为止所做的所有更改立即生效。 回答“Y”。
脚本退出后,使用 rc-service mariadb restart
重新启动服务
要在每次启动时启动数据库守护程序,请运行 rc-update add mariadb default
配置文件和自定义
MariaDB 的配置设置现在组织在单独的文件中,而不是存储在 my.cnf 中。 主要配置是通过将文件添加到 /etc/my.cnf.d/ 来完成的。 用户特定的配置文件存储在 ~/.my.cnf 中。 用户特定的配置文件在系统范围的配置之后加载。 下面列出了各种配置文件的位置。
配置文件 | Alpine 版本 | 要配置的内容 |
---|---|---|
/etc/mysql/my.cnf | v2 到 v3.8 | 所有指令,全局配置文件 |
/etc/my.cnf.d/mariadb-server.cnf | 自 3.9 起 | 第一个全局配置文件,主要指令 |
$HOME/.my.cnf | 所有 | 仅用户名配置指令 |
如前所述,此页面描述了 MariaDB 的基本用法。 对于专业用法,也应参考 MySQL。
- 以下命令将配置服务器以接受所有传入连接。 这仅应在开发中使用,或者在数据库未暴露于互联网或敏感网络时使用。
sed -i "s|.*bind-address\s*=.*|bind-address=0.0.0.0|g" /etc/mysql/my.cnf sed -i "s|.*bind-address\s*=.*|bind-address=0.0.0.0|g" /etc/my.cnf.d/mariadb-server.cnf
- 对于简单的安装,禁用主机名搜索可以提高性能,但仅对本地服务器有用。
sed -i "s|.*skip-networking.*|skip-networking|g" /etc/mysql/my.cnf sed -i "s|.*skip-networking.*|skip-networking|g" /etc/my.cnf.d/mariadb-server.cnf
更新或来自升级
在 Alpine Linux 版本之间升级时,MariaDB 也可能发生主要版本更改,并且数据库应升级以匹配。 此过程的推荐步骤在下面详细介绍。
- 虽然可能不再严格必要,但在升级数据库版本之前备份数据库很有用。
- 更新 Alpine Linux 和 MariaDB/MySQL 软件包。
- 通过运行
apk add mariadb-server-utils
安装 mariadb-server-utils。 - 运行
mysql_upgrade -u root -p
脚本,并提供 root 数据库用户的密码。 - 通过运行
rc-service mariadb restart
重新启动服务。
如果 mysql_upgrade
因 MySQL 无法启动而失败,请尝试使用 mysqld_safe --datadir=/var/lib/mysql/
在安全模式下运行 MySQL,然后再次运行 mysql_upgrade -u root -p
。
创建用户
您可能想要创建一个具有远程访问数据库权限的用户。
打开 mariadb 客户端:mariadb
添加具有关联主机和密码的用户: CREATE OR REPLACE USER admin@'%' IDENTIFIED BY 'ASecurePassword';
注意:@'%' 允许来自任何主机的连接
这不足以允许远程访问。 请参阅 配置 MariaDB 以进行远程客户端访问。
参见
MySQL (MariaDB) - 生产环境使用
MariaDB 是 MySQL 关系数据库管理系统的社区开发分支,旨在根据 GNU GPL 保持自由。 它因由 MySQL 的原始开发者领导而闻名,他们因担心被 Oracle 收购而分叉了它。
本页假设您对 MariaDB 有一般的了解,因此如果您是 MySQL 的新手,请先查看 MariaDB wiki 页面,了解它在 Alpine Linux 中的打包方式。
安装
Alpine Linux 为那些不熟悉从 mysql 更改为 mariadb 命名软件包的人提供了虚拟的对应软件包,请查看 MariaDB wiki 页面 以获取更多信息。
请注意,用户 mysql
是在软件包安装期间创建的,在初始化部分,将在数据库初始化中创建两个用户:root
和 mysql
,并且在那时,只有在他们各自的系统帐户中,才能连接到数据库服务。
apk add mysql mysql-client
这将安装最常用的软件包... mariadb-cient
和 mariadb-server
,此处简要描述了其余软件包以获取更多信息,此处按生产服务器的相关性顺序列出。
MySQL 名称包 | 自 Alpine 版本 | 简要用法 | 相关软件包 |
---|---|---|---|
mysql | v2 | 这是一个虚拟软件包,方便安装 mariadb | mariadb |
mysql-client | v2 | 这是一个虚拟软件包,方便安装命令工具 | mariadb-client |
mariadb | v2 | 服务器等效于 mysql-server | mariadb-common |
mariadb-client | v2 | 连接命令行和工具 | mariadb-common |
mariadb-doc | v3.0 | 手册页就在那里! | man man-pages |
mariadb-connector-odbc | edge | 编码或建立操作系统级别连接,无需安装库即可连接到任何数据库 | . |
mariadb-connector-c | v3.8 | C 源代码上的编码连接 | mariadb-connector-c-dev |
mariadb-backup | v3.8 | 用于外部备份设备,未广泛使用,过去在 mariadb 软件包中 | . |
mariadb-server-utils | v3.8 | 服务器命令未广泛使用,过去在 mariadb 软件包中 | . |
mariadb-dev | v3.1 | 编译需求取决于源代码 | . |
mariadb-test | v3.3 | 来自 MariaDB 工具的测试套件 | . |
mariadb-mytop | v3.9 | 数据性能监控 | . |
mariadb-plugin-rocksdb | v3.9 | 用于数据的纯键值事件关系 | . |
mariadb-static | v3.8 | 用于构建中静态非依赖链接的静态库 | . |
mariadb-embedded | v3.9 | libmysqld 与 C 客户端相同的接口 | mariadb-embedded-dev |
mariadb-embedded-dev | v3.9 | 使用普通的 mysql.h 并与 libmysqld 而不是 libmysqlclient 链接 | mariadb-dev |
mariadb-openrc | v3.8 | 单独的脚本,过去嵌入在服务器软件包中 | . |
初始化
MySQL/MariaDB 的 alpine 软件包就像 MySQL 的普通 tarball 一样,管理员必须知道他们想要什么... 这里没有像 Windows 那样的自动窗口。
datadir 位于 /var/lib/mysql
,必须由 mysql 用户和组拥有。 您可以修改此行为,但必须编辑 /etc/init.d
目录中的服务文件。 此外,您需要在配置文件中 [mysqld]
部分下设置 datadir=<YOUR_DATADIR>
。
- 初始化主 mysql 数据库,并将数据目录标准化为
/var/lib/mysql
,通过 rc 脚本 - 然后初始化服务,此时 root 帐户和套接字连接已启用,无需密码
- 通过分配适当的密码来设置 root 帐户,这纯粹是偏执。 因为下一步已经完成了!
- 通过运行
mysql_secure_installation
来设置和初始化安装 - 设置管理其他用户和数据库的权限
mysql_install_db --user=mysql --datadir=/var/lib/mysql rc-service mariadb start mysqladmin -u root password toor
之后,所有内容都已初始化,可以继续进行配置,现在可以使用下一节中的 mysql_secure_installation
脚本完成
配置
为了完成 MariaDB 中的设置,现在提供 这个名为 mysql_secure_instalation
的脚本,它也以 mariadb-secure-installation
的形式存在。 此脚本提供数据库的最小和安全设置,以下是解释的问题
- 输入 root 用户的当前密码(如果没有密码,请直接按回车): 如果您之前像我们在上一节中所做的那样设置了 root 密码,只需提供它并按回车,必须提供,因为我们之前已经设置过,从现在开始,此脚本将访问引擎并更改数据库上的许多设置。 正确的响应是
OK, successfully used password, moving on...
- 切换到 unix_socket 身份验证 [Y/n] 设置 root 密码或使用 unix_socket 可确保只有管理员可以登录到引擎数据库。 自 mysql 5.6 和 mariadb 10.2 以来,设置了一种新的身份验证机制,即通过套接字身份验证,当系统用户与 mysql/mariadb 用户相同时,在这种情况下,不需要密码。 在生产服务器中,情况并非如此,必须禁用它,所以回答 NO,响应将是
... skipping.
- 更改 root 密码? [Y/n] 仅当第一个问题直接按回车时,或者如果没有设置 unix 套接字,可以提供更好的密码时,才会出现此答案。 如果您提供了良好的密码,只需按“n”,否则只需
- 删除匿名用户? [Y/n] 这允许删除为使用套接字身份验证登录而创建的匿名用户,仅在类 Unix 系统上有效。 在任何情况下,生产系统都必须删除它,所以回答 Y,正确的响应必须是
... Success!
。 - 禁止 root 用户远程登录? [Y/n] 通常,应仅允许 root 用户从“localhost”连接。 这确保了没有人可以从网络猜测 root 密码。 当然要回答 Y,正确的响应必须是
... Success!
。 - 删除测试数据库并禁止对其的访问? [Y/n] 默认情况下,MariaDB 附带一个名为“test”的数据库,任何人都可以访问。 这也仅用于测试,应该删除,所以回答 Y,正确的响应必须是
... Success!
。 - 现在重新加载权限表? [Y/n] 重新加载权限表将确保到目前为止所做的所有更改立即生效,所以回答 Y,正确的响应必须是
... Success!
。
在回答完所有问题后... 使用 rc-service mariadb restart
重新启动服务
配置文件
由于今天受到 systemd 标准化的影响,著名的 my.cnf 不再是服务器引擎的主要配置文件。 现在只有少数变量在那里定义,所有设置都由 /etc/my.cnf.d/
目录中的独立文件提供,用户自己的配置文件位于每个主目录的 ~/.my.cnf
配置文件下,并在全局配置文件之后读取;所以然后我们有
配置文件 | 路径和名称 | Alpine 版本 | 要配置的内容 |
---|---|---|---|
my.cnf | /etc/mysql/my.cnf | v2 到 v3.8 | 所有指令,全局配置文件 |
mariadb-server.cnf | /etc/my.cnf.d/mariadb-server.cnf | 自 3.9 起 | 第一个全局配置文件,主要指令 |
.my.cnf | $HOME | 所有 | 仅用户名配置指令 |
生产设置
这些设置仅推荐用于某些服务器设置,以下是高生产设置的建议
配置设置 | 默认值 | 推荐值 | 说明 |
---|---|---|---|
主内存 | 2G | 8G - 16G | MariaDB/MySQL 可以使用 512M 或 1G 的内存运行,高生产环境必须使用至少 4G 或更多的内存。 |
数据目录磁盘类型 | 任何 | SSD | 如果将产生高请求,MariaDB/MySQL 必须使用更快的 SSD 运行。 |
collation_server | utf8_unicode_ci | utf8mb4_unicode_ci | 使用 8mb4 时,某些字符能够使用超过单个字节。 |
character_set_client | iso8859-1 | utf8 或 utf8mb4 | 重要,因为是标准,对于从左到右使用,请使用 8mb4 风格 |
max_connections | 151 | 100 | total_connections = total_processes * (total_threads + script_servers + 1) |
max_heap_table_size | 16M | 32M | 为内存表分配更多内存,用于内存存储引擎 |
tmp_table_size | 16M | 32M | 它允许子查询更多地保留在内存中,从而使其更快 |
join_buffer_size | 32M | 64M | 它允许连接查询更多地保留在内存中,而不是在临时文件中 |
innodb_file_format | 未设置 | Barracuda | 将允许更长的索引,用于最重要的常用表 |
innodb_large_prefix | 未设置 | 1 | 如果选择了 Barracuda 文件格式,则必须设置 |
innodb_buffer_pool_size | 128M | 456M | 尽可能多地将表和索引保存在系统内存中 |
innodb_read_io_threads | 16 | 32 | 在高 I/O 系统上,大于 1 的值可以使磁盘 I/O 更具顺序性 |
innodb_write_io_threads | 16 | 32 | 仅当您为数据 MySQL/MariaDB 数据库和临时文件使用 SSD 存储时 |
innodb_buffer_pool_instances | 1 | 2 或 4 | 仅适用于较旧的 MySQL/MariaDB 引擎, |
innodb_io_capacity | 200 | 1200 - 2600 | 仅当您为数据 MySQL/MariaDB 数据库和临时文件使用 SSD 存储时 |
innodb_io_capacity_max | 200 | 2400 - 5200 | 仅当您为数据 MySQL/MariaDB 数据库和临时文件使用 SSD 存储时 |
如果您有 SSD 磁盘,请使用推荐的建议,否则,请使用最小建议值。 如果您有物理硬盘驱动器,请使用 2000 * 阵列中活动驱动器的数量。 如果使用 NVMe 或 PCIe 闪存,可以使用高达 200000 的更大的数字,但那些最新的存储设备的使用寿命当然会很短。
较新的系统 Alpine 软件包可以在独立文件中设置,在任何情况下,这些命令始终有效,并且在不适用的地方只会忽略输出
- 在较旧的 Alpine 系统上,必须将 CONFIG FILES FOR MAX ALLOWED PACKETS 设置为最小的适当数量
sed -i "s|.*max_allowed_packet\s*=.*|max_allowed_packet = 100M|g" /etc/mysql/my.cnf sed -i "s|.*max_allowed_packet\s*=.*|max_allowed_packet = 100M|g" /etc/my.cnf.d/mariadb-server.cnf
- 仅在只有一个服务器或不希望从其他服务器连接的情况下允许本地连接
sed -i "s|.*bind-address\s*=.*|bind-address=127.0.0.1|g" /etc/mysql/my.cnf sed -i "s|.*bind-address\s*=.*|bind-address=127.0.0.1|g" /etc/my.cnf.d/mariadb-server.cnf
- 如果不在域控制器中,则不要搜索主机名以提高性能响应(非常适合仅本地服务器)
sed -i "s|.*skip-networking.*|skip-networking|g" /etc/mysql/my.cnf sed -i "s|.*skip-networking.*|skip-networking|g" /etc/my.cnf.d/mariadb-server.cnf
- 将默认字符集设置为 UTF8MB4,在较新版本(自 Alpine v3.9 起)中,只需添加一个新文件即可添加此自定义设置,但较旧版本(低于 Alpine v3.8)的软件包没有字符集部分,因此您必须在每个相应的部分中手动添加到主配置中
cat > /etc/my.cnf.d/mariadb-server-default-charset.cnf << EOF [client] default-character-set = utf8mb4 [mysqld] collation_server = utf8mb4_unicode_ci character_set_server = utf8mb4 [mysql] default-character-set = utf8mb4 EOF
更新或来自升级
Alpine linux 版本之间的主要升级就像更改仓库版本一样容易,但是当执行此操作时,MySQL/MariaDB 引擎需要一些额外的步骤
在 mariadb 的主要版本发布时升级数据库(例如从 mariadb-10.1.10-1 到 mariadb-10.1.18-1),明智的做法是升级数据库
- 保留引擎守护程序的旧数据库(mysql 模式)结构,目前情况不再如此,今天这不再有意义
- 升级 MariaDB/MySQL 软件包,当然,如果升级到主要 alpine 版本没有完成,则必须这样做!
- 运行
mysql_upgrade -u root -p
脚本,提供 root 的密码,(来自新软件包版本)针对仍在运行的旧数据库(mysql 模式)。 这将产生一些错误消息; 但是,升级将成功。 - 重新启动服务
如果由于 MySQL 无法启动而无法运行 mysql_upgrade,请尝试使用 mysqld_safe --datadir=/var/lib/mysql/
命令在安全模式下运行 MySQL,然后运行 mysql_upgrade -u root -p
脚本。
相关重要提示
关于管理数据库的文件系统注意事项
Btrfs 注意事项
如果数据库(在 /var/lib/mysql
中)位于 btrfs 文件系统上,您应该考虑在创建任何数据库(模式)之前禁用该目录的 Copy-on-Write,在初始化后,您可以再次启用它。 但是...在每次数据库创建(模式创建)时,您都必须再次禁用它,以避免数据损坏。
ZFS 块大小
与大多数其他文件系统不同,ZFS 具有可变记录大小,或者通常称为块大小。 默认情况下,ZFS 上的 recordsize 为 128KiB,这意味着它将根据写入文件的大小动态分配从 512B 到 128KiB 的任何大小的块。 大多数 RDBMS 默认以 8KiB 大小的块工作。 虽然块大小对于 MySQL/MariaDB 是可调整的,但默认情况下使用 8KiB 块大小。
通常希望调整 ZFS 以适应数据库,使用诸如 zfs set recordsize=8K /var/lib/mysql
之类的命令(或将 /var/lib/mysql 更改为 /var/lib/mysql 所在的挂载点),并且为了节省内存,最好只是禁用 ZFS 对数据库文件数据的缓存,并让数据库使用 zfs set primarycache=metadata /var/lib/mysql
来完成自己的工作(或将 /var/lib/mysql 更改为 /var/lib/mysql 所在的挂载点)。
但请注意,这些类型的调整参数仅适用于在专用分区中设置 RDBMS 的情况,如果您的 root 和当然数据库都在一个分区中,请不要这样做。 分开它们。
恢复 root 密码
rc-service mysql stop kill `cat /run/mysqld/mysqld.pid` /usr/bin/mysqld --datadir=/var/lib/mysql --pid-file=/run/mysqld/mysqld.pid --skip-grant-tables --skip-networking & mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';FLUSH PRIVILEGES;ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';FLUSH PRIVILEGES;set password = password('MyNewPass');" kill `cat /run/mysqld/mysqld.pid` rc-service mariadb restart
参见
MariaDB vs MySQL
这更多是兼容性问题,而不是性能和特性问题,这取决于是否存在纯粹的业务和支持方法“零关注”。
MySQL 来自 Oracle,如果未购买许可证,则会设置限制。 MariaDB 具有大型连接池,超过 200,000 个连接,而 MySQL 如果未获得许可,则连接池较小。
在性能方面,MariaDB 仅比 MySQL 稍快。
哪个更优化尚不清楚... 一般来说,MySQL 应该更少,而 MariaDB 更快。 还有第三个选择,Percona Server,它与 MySQL 服务相同,但具有用于服务器的特殊 агрессивный 优化补丁。 Percona mysql 代码必须在 Alpine linux 中编译。
对比表格
特性 | MariaDB | MySQL |
---|---|---|
存储引擎 | 约 10 个,但有些在开发阶段 | 较少但经过良好测试 |
性能 | 只是稍快一点 | 较少,几乎没有区别 |
向量 | 是,从 MariaDB 11.7 开始 | 仅限企业版 |
初始版本 | 2009 (5.3) | 1995 (3.0) |
数据脱敏 | 否 | 仅限企业版 |
动态列 | 是 | 是 |
时态表 | 是 | 否 |
监控 | SQLyog | MySQLworkbench |
路由 | MariaDB MaxScale | MySQL Router |
分析 | MariaDB ColumnStore | 否 |
Git star 数 (GitHub) | 约 5.9k | 约 11.2k |
更多信息,请参阅