MySQL
MySQL 是自由软件中最流行的关系数据库服务器,原因很简单(虽然不是最佳技术原因)
- 它简单且非常易于使用
- 它与 SQLSERVER 非常相似,也用于其他系统
在 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 | server 等效于 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 | 与 C 客户端相同的 libmysqld 接口 | 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 用户当前密码(没有密码则按 Enter): 如果您之前设置了 root 密码,请在此处提供并按 Enter。否则,只需按 Enter。
- 切换到 unix_socket 身份验证 [Y/n] 设置 root 密码或使用 Unix_socket 确保只有管理员可以登录引擎数据库。对于非生产服务器,只需按“n”来设置 root 密码,这将给您响应
... 跳过。
- 更改 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。
- 以下命令将配置服务器以接受所有传入连接。这应该仅在开发时完成,或者如果数据库未暴露于 Internet 或敏感网络。
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 | server 等效于 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 | 与 C 客户端相同的 libmysqld 接口 | 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 用户当前密码(没有密码则按 Enter): 这是如果您之前像我们在上一节中所做的那样设置了 root 密码,只需提供它并按 Enter,必须提供,因为我们之前已经设置了,从现在开始,此脚本将访问引擎并更改数据库上的许多设置。正确的响应是
OK, successfully used password, moving on...
- 切换到 unix_socket 身份验证 [Y/n] 设置 root 密码或使用 unix_socket 可确保只有管理员可以登录引擎数据库。自 mysql 5.6 和 mariadb 10.2 以来,设置了一种新的身份验证机制,通过套接字身份验证,当系统用户与 mysql/mariadb 用户相同时,在这种情况下,不需要密码。在生产服务器中,情况并非如此,必须禁用它,因此回答 NO,响应将是
... 跳过。
- 更改 root 密码?[Y/n] 只有在第一个问题只是按 Enter 时,或者如果没有设置 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 系统上,必须将 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 文件系统上,您应考虑在创建任何数据库(架构)之前禁用目录的写入时复制,初始化后您可以再次启用。但是...在每次数据库创建(架构创建)时,您都必须再次禁用,以避免数据损坏。
ZFS 块大小
ZFS 与大多数其他文件系统不同,具有可变记录大小,或通常称为块大小。默认情况下,ZFS 上的记录大小为 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 |
更多信息,请参阅