22. Databases
本章包括从单用户读/写到具有事务支持的工业数据库服务器的数据库。通常,您将被送到这里来满足对其他应用程序的依赖,尽管在基本LFS系统上构建SQL服务器是完全可能的。
22.1 Important Notes About Upgrading Database Server Software
注意
本节介绍在使用已有数据库时如何重新安装数据库软件。它不适用于初始安装,或者如果要更新的包没有现有的数据库,但是用户应该通读它,以了解将来可能出现的问题。
让我们从一个真实发生的错误的戏剧性截图开始这一章。如果您是第一次安装数据库软件,则不会出现此错误:
$ sudo systemctl status postgresql
-- postgresql.service - PostgreSQL database server
Loaded: loaded (/usr/lib/systemd/system/postgresql.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Tue 2021-10-26 17:11:53 CDT; 2min 49s ago
Process: 17336 ExecStart=/usr/bin/pg_ctl -s -D ${PGROOT}/data start -w -t 120 (code=exited, status=1/FAILURE)
CPU: 7ms
Oct 26 17:11:53 SVRNAME systemd[1]: Starting PostgreSQL database server...
Oct 26 17:11:53 SRVNAME postgres[17338]: 2021-10-26 17:11:53.420 CDT [17338] FATAL:
database files are incompatible with server
Oct 26 17:11:53 SRVNAME postgres[17338]: 2021-10-26 17:11:53.420 CDT [17338] DETAIL:
The data directory was initialized by PostgreSQL version 13,
which is not compatible with this version 14.0.
Oct 26 17:11:53 SRVNAME postgres[17336]: pg_ctl: could not start server
Oct 26 17:11:53 SRVNAME postgres[17336]: Examine the log output.
Oct 26 17:11:53 SRVNAME systemd[1]: postgresql.service: Control process exited, code=exited, status=1/FAILURE
Oct 26 17:11:53 SRVNAME systemd[1]: postgresql.service: Failed with result 'exit-code'.
Oct 26 17:11:53 SRVNAME systemd[1]: Failed to start PostgreSQL database server.
为了避免这种情况(例如,您的数据库服务器软件拒绝启动),请阅读下面关于升级DBMS(数据库管理系统)的最佳方法的讨论。
上面显示的错误的根本原因是将服务器软件升级到较新的主要版本,而数据文件没有受到影响。在这种情况下,管理员能够在不丢失任何数据的情况下恢复DBMS。
即使您是初次安装DBMS,也请通读本节。它提供了关于实现备份和恢复过程(或者至少是创建备份和恢复过程的策略)的信息,这些信息将满足您的需求并保证数据的安全性。
升级数据库服务器包
数据库系统处理保存数据库元数据和数据本身的文件。这些文件的内部结构被优化以供服务器软件使用。当这样的服务器软件升级时,新软件可能使用不同于以前使用的文件格式。有时,新软件既可以使用旧格式,也可以使用新格式,但没有新格式提供的性能改进。其他时候,新的服务器软件会在升级后自动重新格式化数据文件。
不幸的是,最可能的情况是新的服务器软件抱怨过时的文件格式和退出。当这种情况发生时,您已经覆盖了旧的服务器软件,您可能会以系统损坏和数据丢失而告终。
数据文件格式的更改通常发生在主要版本更改时,但也可能发生在其他时间。在升级任何DBMS软件之前,请检查文档,以查看此升级是否进行了需要重新格式化数据库的更改。
当然,如果数据库的内容不容易重新构建,那么不时地创建数据库备份总是一个好主意。在升级服务器软件之前,您应该运行另一个备份。
通过备份和恢复升级
注意
如果没有经过验证的过程从该备份恢复数据,则备份是无用的。在运行数据库服务器时,不仅应该创建备份;您还应该验证恢复过程是否确实有效。测试恢复过程的时间是在紧急需要恢复丢失的数据之前。
大多数数据库服务器软件都提供一些基本工具来创建数据备份。通常使用这些工具创建的备份可以被更新版本的软件读取(通过还原工具)。使用较旧的恢复工具和较新的备份数据是一个坏主意;你不应该盲目地认为它会起作用。可能会,但通常不会。
升级数据库文件的最简单方法是
-
使用旧工具创建一个完整的数据库备份。
此步骤创建数据库文件的脱机副本—用于长期归档、灾难恢复或为升级做准备。这种离线备份包括(1)当前数据库文件的完整一对一副本,或者(2)从某个时间点开始的数据库文件的完整备份,以及描述该时间点之后所做更改的所有日志数据(这是Oracle术语,在Postgresql中称为“连续归档”或“提前写日志(WAL)”)。创建第二种表单所需的时间更少(如果DB软件提供这种类型的日志记录),因为您只需要保存自上次创建完整备份以来更改的数据。
当升级数据库服务器软件时,应该创建一个完整的备份(可以用于后续的增量备份);但是如果有很多数据,增量备份就足够了。最适合您的策略取决于数据库中存储的数据量(是几百个表行,还是几百TB ?)后一种情况下的完全备份无法快速完成。为了充分保护您的数据,请创建旧程序(和/或其源)的备份,并将其与数据文件一起保存,以确保在新软件无法读取旧数据时有一个后备解决方案。
-
升级服务器软件
在这一步中,构建数据库服务器软件的指令被执行,就像后面讨论MariaDB或Postgresql等DBMs的章节中所展示的那样。也就是说,像往常一样使用BLFS指令构建软件。
-
使用新工具恢复数据库。
恢复数据时,需要使用新安装的服务器软件自带的工具。在恢复过程中,新工具将以新软件所需的格式创建和/或升级数据文件。假定较新的软件能够读取旧的数据。
由于您已经有了备份过程(并且您已经测试了恢复过程,对吗?),这可能是最简单的升级方法,因为您可以像往常一样使用您熟悉的过程进行升级,至少在备份和恢复方面是这样。
使用系统工具升级数据库文件
一些数据库系统(例如Postgresql)提供了一个工具,可以将现有的数据库文件重新格式化(升级)为新的格式。如果需要从备份中恢复(例如,运行升级工具失败),则必须重新安装旧软件才能恢复数据。
即使重新格式化工具可能像宣传的那样工作,您也应该在运行它们之前创建一个完整备份。故障可能会对数据库造成严重损坏。
特定DBMS的注意事项
PostgreSQL
备份/还原上游文档: https://www.postgresql.org/docs/current/backup.html
MariaDB
备份/还原上游文档: https://mariadb.com/kb/en/backup-and-restore-overview/
Sqlite
不要低估Sqlite。它是一个功能丰富的DBMS。与上述两大竞争者的主要区别在于,Sqlite不通过网络API提供访问。Sqlite数据库总是存储在运行使用该数据库的程序的机器上。数据内容的操作是通过直接在程序中调用库函数的API来完成的。
在上游文档中,您可能会发现以下内容很有用:
sqlite3命令行工具文档: https://www.sqlite.org/cli.html
备份API调用的文档: https://www.sqlite.org/backup.html
不幸的是,在上游文档中没有专门的章节讨论备份/恢复,但是在Internet上有几篇关于它的文章。这里有一个例子。
备份/还原文档: https://database.guide/backup-sqlite-database/
Berkeley DB
像Sqlite一样,这个软件作用于本地数据库文件;没有网络接口。
备份/恢复Berkeley数据库的相关资源是db_dump及其对应的db_load的手册页。
22.2 Berkeley DB-5.3.28
简介Berkeley DB
Berkeley DB包包含许多其他应用程序用于数据库相关功能的程序和实用程序。
已知此包可以使用LFS 11.3平台进行构建并正常工作。
包信息
-
下载 (HTTP): https://anduin.linuxfromscratch.org/BLFS/bdb/db-5.3.28.tar.gz
-
下载 MD5 校验和: b99454564d5b4479750567031d66fe24
-
下载大小: 34 MB
-
预计所需磁盘空间: 265 MB
-
预计构建时间: 0.6 SBU
Berkeley DB 依赖
可选
libnsl-2.0.0 和 Sharutils-4.15.2 (对于uudecode命令)
用户笔记: https://wiki.linuxfromscratch.org/blfs/wiki/db
安装Berkeley DB
首先应用一个修复,使它可以与当前版本的g++编译:
sed -i 's/\(__atomic_compare_exchange\)/\1_db/' src/dbinc/atomic.h
运行如下命令安装Berkeley DB:
cd build_unix &&
../dist/configure --prefix=/usr \
--enable-compat185 \
--enable-dbm \
--disable-static \
--enable-cxx &&
make
现在,作为root用户:
make docdir=/usr/share/doc/db-5.3.28 install &&
chown -v -R root:root \
/usr/bin/db_* \
/usr/include/db{,_185,_cxx}.h \
/usr/lib/libdb*.{so,la} \
/usr/share/doc/db-5.3.28
命令解释
cd build_unix && ../dist/configure –prefix=/usr…: 这取代了普通的./configure命令,因为Berkeley DB自带针对不同平台的各种构建目录。
--enable-compat185: 此开关允许构建DB-1.85兼容性API。
--enable-cxx: 此开关支持构建C++ API库。
--enable-dbm: 启用一些旧包所需的遗留接口支持。
make docdir=/usr/share/doc/db-5.3.28 install: 这将把文档安装在标准位置,而不是/usr/docs。
chown -v -R root:root …: 该命令将各种已安装文件的所有权从构建器的uid:gid更改为root:root。
--enable-tcl --with-tcl=/usr/lib: 在DB中启用Tcl支持并创建libdb_tcl库。
--enable-java: 在DB中启用Java支持并创建libdb_java库。Java-7.x目前不支持。
内容
安装程序: db_archive, db_checkpoint, db_deadlock, db_dump, db_hotbackup, db_load, db_log_verify, db_printlog, db_recover, db_replicate, db_stat, db_tuner, db_upgrade, 和 db_verify
安装库: libdb.so, libdb_cxx.so, 和 libdb_tcl.so
安装目录: /usr/share/doc/db-5.3.28
简短描述
db_archive 打印不再使用的日志文件的路径名。
db_checkpoint 是一个守护进程,用于监视和检查点数据库日志。
db_deadlock 用于在检测到死锁时中止锁请求。
db_dump 将数据库文件转换为db_load可读的平面文件格式。
db_hotbackup 创建Berkeley DB数据库的“热备份”或“热故障转移”快照。
db_load 用于从使用db_dump创建的平面文件创建数据库文件。
db_log_verify 验证数据库的日志文件。
db_printlog 将数据库日志文件转换为人类可读的文本。
db_recover 用于在数据库发生故障后将数据库恢复到一致状态。
db_replicate 是一个守护进程,在事务环境中提供replication/HA服务。
db_stat 显示数据库环境统计信息。
db_tuner 分析btree数据库中的数据,并建议可能提供最佳操作的页面大小。
db_upgrade 用于将数据库文件升级到较新版本的Berkeley DB。
db_verify 用于对数据库文件进行一致性检查。
22.3 lmdb-0.9.29
简介lmdb
lmdb包是一个快速、紧凑的键值嵌入式数据存储。它使用内存映射文件,因此它具有纯内存数据库的读取性能,同时仍然提供基于磁盘的标准数据库的持久性,并且仅受虚拟地址空间大小的限制。
已知此包可以使用LFS 11.3平台进行构建并正常工作。
包信息
-
下载 (HTTP): https://github.com/LMDB/lmdb/archive/LMDB_0.9.29.tar.gz
-
下载 MD5 校验和: 84cc7cac4bf15486536560f171297a49
-
下载大小: 144 KB
-
预计所需磁盘空间: 6.1 MB
-
预计构建时间: 小于 0.1 SBU
用户笔记: https://wiki.linuxfromscratch.org/blfs/wiki/lmdb
安装lmdb
注意
这个包解压到lmdb-LMDB_0.9.29.
运行如下命令安装lmdb:
cd libraries/liblmdb &&
make &&
sed -i 's| liblmdb.a||' Makefile
这个包没有附带测试套件。
现在,作为root用户:
make prefix=/usr install
命令解释
sed … liblmdb.a … Makefile: 包可执行文件使用静态库,因此必须创建它。该命令禁止安装静态库。
内容
安装程序: mdb_copy, mdb_dump, mdb_load, 和 mdb_stat
安装库: liblmdb.so
安装目录: None
22.4 MariaDB-10.6.12
简介MariaDB
MariaDB是一个社区开发的分支,是MySQL关系数据库管理系统的临时替代品。
已知此包可以使用LFS 11.3平台进行构建并正常工作。
包信息
-
下载 (HTTP): https://downloads.mariadb.org/interstitial/mariadb-10.6.12/source/mariadb-10.6.12.tar.gz
-
下载 (FTP): ftp://mirrors.fe.up.pt/pub/mariadb/mariadb-10.6.12/source/mariadb-10.6.12.tar.gz
-
下载 MD5 校验和: 70b118a5a82846fe64adbf99d766d3e9
-
下载大小: 91 MB
-
预计所需磁盘空间: 2.3 GB (安装659 MB)
-
预计构建时间: 7.9 SBU (并行数=4时,添加0.4 SBU用于测试)
注意
MariaDB的安装大小为658 MB,但如果需要,可以通过在安装后删除/usr/share/mysql/test目录来减少大约252 MB。
MariaDB 依赖
必要
推荐
可选
Boost-1.81.0, libaio-0.3.113, libxml2-2.10.3, Linux-PAM-1.5.2, MIT Kerberos V5-1.20.1, pcre2-10.42, Ruby-3.2.1, sphinx-6.1.3, unixODBC-2.3.11, Valgrind-3.20.0, Groonga, KyTea, Judy, lz4, MeCab, MessagePack, mruby, MyRocks, Snappy, 和 ZeroMQ
用户笔记: https://wiki.linuxfromscratch.org/blfs/wiki/mariadb
安装MariaDB
警告
MariaDB和MySQL不能安装在同一个系统上,除非对其中一个应用程序的构建配置进行大量更改。
出于安全考虑,强烈建议以非特权用户和组的身份运行服务器。执行以下命令(以root身份)创建用户和组:
groupadd -g 40 mysql &&
useradd -c "MySQL Server" -d /srv/mysql -g mysql -s /bin/false -u 40 mysql
运行如下命令安装MariaDB:
mkdir build &&
cd build &&
cmake -DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=/usr \
-DGRN_LOG_PATH=/var/log/groonga.log \
-DINSTALL_DOCDIR=share/doc/mariadb-10.6.12 \
-DINSTALL_DOCREADMEDIR=share/doc/mariadb-10.6.12 \
-DINSTALL_MANDIR=share/man \
-DINSTALL_MYSQLSHAREDIR=share/mysql \
-DINSTALL_MYSQLTESTDIR=share/mysql/test \
-DINSTALL_PAMDIR=lib/security \
-DINSTALL_PAMDATADIR=/etc/security \
-DINSTALL_PLUGINDIR=lib/mysql/plugin \
-DINSTALL_SBINDIR=sbin \
-DINSTALL_SCRIPTDIR=bin \
-DINSTALL_SQLBENCHDIR=share/mysql/bench \
-DINSTALL_SUPPORTFILESDIR=share/mysql \
-DMYSQL_DATADIR=/srv/mysql \
-DMYSQL_UNIX_ADDR=/run/mysqld/mysqld.sock \
-DWITH_EXTRA_CHARSETS=complex \
-DWITH_EMBEDDED_SERVER=ON \
-DSKIP_TESTS=ON \
-DTOKUDB_OK=0 \
.. &&
make
要测试结果,发出:make test。众所周知,test-connect测试会失败。
注意
可以使用以下命令运行更广泛的测试集:
pushd mysql-test
./mtr --parallel <N> --mem --force
popd
其中N是并行运行的测试数。超过5400个测试在大约24个SBU中运行,N=4。一些测试可能会失败,主要是由于字符集问题。
现在,作为root用户:
make install
命令解释
-DWITH_EMBEDDED_SERVER=ON: 此开关可以编译某些应用程序(如Amarok)所需的嵌入式服务器库。
-DWITH_EXTRA_CHARSETS=complex: 此开关支持复杂字符集。
-DSKIP_TESTS=ON: 此开关禁用MariaDB Connector/C的测试,如果没有额外的设置,这些测试不支持。
-DWITHOUT_SERVER=ON: 如果您不需要服务器,只想构建客户端,请使用此开关。
注意
有许多选项可用于cmake。检查cmake . -LH的输出以获得额外的定制选项。
配置 MySQL
配置文件
/etc/mysql/my.cnf 和 ~/.my.cnf
配置信息
以root用户使用以下命令创建/etc/mysql/my.cnf:
install -v -dm 755 /etc/mysql &&
cat > /etc/mysql/my.cnf << "EOF"
# Begin /etc/mysql/my.cnf
# The following options will be passed to all MySQL clients
[client]
#password = your_password
port = 3306
socket = /run/mysqld/mysqld.sock
# The MySQL server
[mysqld]
port = 3306
socket = /run/mysqld/mysqld.sock
datadir = /srv/mysql
skip-external-locking
key_buffer_size = 16M
max_allowed_packet = 1M
sort_buffer_size = 512K
net_buffer_length = 16K
myisam_sort_buffer_size = 8M
# Don't listen on a TCP/IP port at all.
skip-networking
# required unique id between 1 and 2^32 - 1
server-id = 1
# Uncomment the following if you are using BDB tables
#bdb_cache_size = 4M
#bdb_max_lock = 10000
# InnoDB tables are now used by default
innodb_data_home_dir = /srv/mysql
innodb_log_group_home_dir = /srv/mysql
# All the innodb_xxx values below are the default ones:
innodb_data_file_path = ibdata1:12M:autoextend
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
innodb_buffer_pool_size = 128M
innodb_log_file_size = 48M
innodb_log_buffer_size = 16M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates
[isamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[myisamchk]
key_buffer_size = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M
[mysqlhotcopy]
interactive-timeout
# End /etc/mysql/my.cnf
EOF
你现在可以安装一个数据库,并将所有权更改为非特权用户和组(作为root用户执行):
mysql_install_db --basedir=/usr --datadir=/srv/mysql --user=mysql &&
chown -R mysql:mysql /srv/mysql
进一步的配置需要MariaDB服务器正在运行。以root用户使用以下命令启动服务器:
install -v -m755 -o mysql -g mysql -d /run/mysqld &&
mysqld_safe --user=mysql 2>&1 >/dev/null &
默认安装不会为管理员设置密码,因此使用以下命令作为root用户设置密码。
mysqladmin -u root password
服务器的配置现在已经完成。以root用户使用以下命令关闭服务器:
mysqladmin -p shutdown
Systemd Unit
安装blfs-systemd-units-20220720包中的mysqld.service单元,以root用户在系统启动时启动MariaDB服务器。
make install-mysqld
注意
如果您已经有一个现有的数据库,并且这个二进制文件的安装只是升级到一个较新的版本,请查看上游文档以了解升级。建议运行:
mariadb-upgrade
内容
安装程序: aria_chk, aria_dump_log, aria_ftdump, aria_pack, aria_read_log, aria_s3_copy, galera_new_cluster, galera_recovery, innochecksum, mariabackup, mariadb, mariadbd, mariadb-access, mariadb-admin, mariadb-backup, mariadb-binlog, mariadb-check, mariadb-client-test, mariadb-client-test-embedded, mariadb-conv, mariadb-convert-table-format, mariadb-find-rows, mariadbd-multi, mariadbd-safe, mariadbd-safe-helper, mariadb-dump, mariadb-dumpslow, mariadb-embedded, mariadb-fix-extensions, mariadb-hotcopy, mariadb-import, mariadb-install-db, mariadb-ldb, mariadb-plugin, mariadb-secure-installation, mariadb-setpermission, mariadb-service-convert, mariadb-show, mariadb-slap, mariadb-test, mariadb-test-embedded, mariadb-tzinfo-to-sql, mariadb-upgrade, mariadb-waitpid, mariadb_config, mbstream, msql2mysql, my_print_defaults, myisamchk, myisam_ftdump, myisamlog, myisampack, mysql_config, mytop, perror, replace, resolve_stack_dump, resolveip, sst_dump, wsrep_sst_common, wsrep_sst_mariabackup, wsrep_sst_mysqldump, 和 wsrep_sst_rsync
安装库: libmariadbclient.a, libmariadb.so, libmariadbd.so, libmysqlclient.a, libmysqlclient_r.a (符号链接到 libmariadbclient.a), libmysqld.{so,a}, libmysqlservices.a, 还有一些在 /usr/lib/mysql/plugin/ 下。
安装目录: /etc/mysql, /usr/{include,lib,share}/mysql, /usr/share/groonga{-normalizer-mysql}, 和 /usr/share/doc/mariadb-10.6.12
简短描述
有几个从mysql*到mariadb对应的符号链接。维护它们是为了保持兼容性。
为了使某些MariaDB支持程序正常工作,必须安装Perl DBI模块。
简短描述
aria_chk 用于检查、修复、优化、排序和获取有关Aria表的信息。
aria_dump_log 是一个转储Aria日志页面内容的工具。
aria_ftdump 显示全文索引信息。
aria_pack 是生成压缩的只读Aria表的工具。
aria_read_log 显示Aria日志文件内容。
aria_s3_copy 在AWS S3之间复制aria表。
galera_new_cluster 引导一个新的Galera集群。
galera_recovery 从Galera集群中恢复数据。
innochecksum 打印InnoDB文件的校验和。
mariabackup 是InnoDB和XtraDB的开源备份工具。
mariadb 是一个简单的SQL shell,具有输入行编辑功能。
mariadbd 是MySQL服务器守护进程。
mariadb-access 检查主机名、用户名和数据库组合的访问权限。
mariadb-admin 是执行管理操作的客户机。
mariadb-binlog 读取二进制日志文件。
mariadb-check 执行表维护:检查、修复、优化或分析表。
mariadb-client-test 用于测试MySQL客户端API的某些方面,这些方面无法使用mysqltest及其测试语言进行测试。
mariadb-client-test-embedded 是测试嵌入式服务器客户端API的工具。
mariadb-conv 转换字符集以供MariaDB使用。
mariadb-convert-table-format 将数据库中的表转换为使用特定的存储引擎。
mariadbd-multi 用于管理几个mysqld进程,这些进程监听不同Unix套接字文件和TCP/IP端口上的连接。
mariadbd-safe 是在Unix和NetWare上启动mysqld服务器的推荐方法。
mariadb-dump 是一个备份程序。
mariadb-dumpslow 解析MySQL慢速查询日志文件并打印其内容的摘要。
mariadb-embedded 是一个静态链接到libmariadbd的MySQL客户端。
mariadb-find-rows 读取包含SQL语句的文件,并提取匹配给定正则表达式或包含使用 db_name或SET语句的语句。
mariadb-fix-extensions 将MyISAM(或ISAM)表文件的扩展名转换为规范形式。
mariadb-hotcopy 锁定表,刷新表,然后执行数据库的副本。
mariadb-import 读取一系列数据格式,并将数据插入数据库。
mariadb-install-db 初始化MySQL数据目录,并创建其中包含的系统表(如果它们不存在)。
mariadb-ldb 是RocksDB工具。
mariadb-plugin 是一个实用程序,使MySQL管理员能够管理MySQL服务器加载哪些插件。
mariadb-secure-installation 是一个提高MySQL安装安全性的工具。
mariadb-service-convert 基于当前mariadb设置生成systemd单元。
mariadb-setpermission 设置MySQL授权表中的权限。
mariadb-show 显示了MariaDB数据库的结构。
mariadb-slap 是一个诊断程序,用于模拟MySQL服务器的客户端负载,并报告每个阶段的时间。
mariadb-test 针对MySQL服务器运行一个测试用例,并可选择将输出与结果文件进行比较。
mariadb-test-embedded 类似于mysqltest命令,但是支持libmysqld嵌入式服务器。
mariadb-tzinfo-to-sql 加载mysql数据库中的时区表。
mariadb-upgrade 检查所有数据库中的所有表是否与当前版本的MySQL服务器不兼容。
mariadb-waitpid 向进程发出终止信号,并等待该进程退出。
mariadb_config 获取使用MariaDB Connector/C的编译器标志。
mbstream 是一个通过流发送InnoDB和XTraDB备份的实用程序。
msql2mysql 是一个将mSQL程序转换为MySQL使用的工具。
my_print_defaults 显示选项文件的选项组中的选项。
myisam_ftdump 显示MyISAM表中有关FULLTEXT索引的信息。
myisamchk 获取有关数据库表的信息,或检查、修复或优化它们。
myisamlog 显示MyISAM日志文件内容。
myisampack 是压缩MyISAM表的工具。
mysql_config 提供了编译MySQL客户端并将其连接到MySQL的有用信息。
mytop 是一个基于控制台的工具,用于监视MySQL服务器的线程和整体性能。
perror 是一个实用程序,用于显示系统或存储引擎错误代码的描述。
replace 是对SQL标准的MariaDB/MySQL扩展。
resolve_stack_dump 将数字堆栈转储解析为符号。
resolveip 是一个将IP地址解析为主机名,反之亦然的实用程序。
sst_sump 转储sst文件(RocksDB使用的格式)的内容。
22.5 PostgreSQL-15.2
简介PostgreSQL
PostgreSQL是一种高级的对象关系数据库管理系统(ORDBMS),派生自Berkeley Postgres数据库管理系统。
已知此包可以使用LFS 11.3平台进行构建并正常工作。
包信息
-
下载 (HTTP): https://ftp.postgresql.org/pub/source/v15.2/postgresql-15.2.tar.bz2
-
下载 MD5 校验和: 968418dbdd700caaccfeabcee7516496
-
下载大小: 21.6 MB
-
预计所需磁盘空间: 209 MB (添加42 MB用于测试)
-
预计构建时间: 0.6 SBU (并行数=4时,添加0.1 SBU用于测试)
PostgreSQL 依赖
可选
ICU-72.1, libxml2-2.10.3, libxslt-1.1.37, OpenLDAP-2.6.4, Linux-PAM-1.5.2, MIT Kerberos V5-1.20.1 和 Bonjour
可选 (重新生成文档)
fop-2.8, docbook-4.5-dtd, docbook-dsssl-1.79, DocBook-utils-0.6.14, OpenJade-1.3.2, 和 SGMLSpm-1.1
用户笔记: https://wiki.linuxfromscratch.org/blfs/wiki/postgresql
安装PostgreSQL
为了增强安全性,最好有一个专门的组和用户来运行PostgreSQL服务器。首先,以root用户的身份发布:
groupadd -g 41 postgres &&
useradd -c "PostgreSQL Server" -g postgres -d /srv/pgsql/data \
-u 41 postgres
注意
有几个配置项可以通过可选包向PostgreSQL添加额外的功能。使用 ./configure –help 查看列表。
使用以下命令安装PostgreSQL:
sed -i '/DEFAULT_PGSOCKET_DIR/s@/tmp@/run/postgresql@' src/include/pg_config_manual.h &&
./configure --prefix=/usr \
--enable-thread-safety \
--docdir=/usr/share/doc/postgresql-15.2 &&
make
在contrib/目录下有许多程序。如果您打算将此安装作为服务器运行,并希望构建其中的一些,请为每个子目录输入make -C contrib或make -C contrib/<SUBDIR-NAME>。
测试必须以非特权用户身份运行,因为它们需要启动临时服务器,不能以根用户身份运行。出于同样的原因,您需要停止所有正在运行的PostgreSQL服务器。如果安装的是旧版本的PostgreSQL,可能需要使用–disable-rpath和configure来避免失败,但不建议安装使用此开关创建的二进制文件。要测试结果,发出:make check。
注意
如果您正在安装PostgreSQL以升级现有的安装,那么您需要遵循以下重要步骤。如果新构建的主版本大于以前的版本,则数据文件格式可能已经更改。新的软件不能作用于现有的数据文件。在这种情况下,服务器将不会启动,因为旧的程序已经被覆盖,所以数据在文件格式转换之前是不可用的。
在升级现有PostgreSQL安装之前,请查看文档,了解在升级过程中必须记住的任何注意事项。请注意,新的主要版本可能会在数据对象中使用不同的二进制格式,从而导致潜在的不兼容性。要了解更多信息,请查看upstream关于升级PostgreSQL的文档。https://www.postgresql.org/docs/current/upgrading.html。
此时,您的文件系统上可能同时安装了新旧二进制文件。这些二进制文件可用于执行现有数据库文件的升级。对于下面的说明,假设:
-
实际的数据文件存储在
/srv/pgsql/data中。 -
升级后的数据文件存放在
/srv/pgsql/newdata目录下。 -
有足够的磁盘空间容纳实际数据文件两次。升级不是内联升级,但它会将数据复制到新的数据库文件中。
首先,做一个临时安装,这使得访问新的二进制文件更容易:
make DESTDIR=$(pwd)/DESTDIR install
接下来,创建一个目录,由可写的postgres用户, 以root用户执行:
install -d -o postgres $(pwd)/DESTDIR/tmp
现在,停止现有的PostgreSQL实例,以root用户启动升级进程:
pushd $(pwd)/DESTDIR/tmp
systemctl stop postgresql
su postgres -c "../usr/bin/initdb -D /srv/pgsql/newdata"
su postgres -c "../usr/bin/pg_upgrade \
-d /srv/pgsql/data -b /usr/bin \
-D /srv/pgsql/newdata -B ../usr/bin"
popd
此时,数据库文件在磁盘上的两个位置上可用。旧数据位于/srv/pgsql/data,新数据位于/srv/pgsql/newdata。建议在继续之前备份旧的数据库文件。
接下来,删除旧的数据库文件,并以root用户重命名新的数据目录:
rm -rf /srv/pgsql/data
mv /srv/pgsql/newdata /srv/pgsql/data
现在,作为root用户:
make install &&
make install-docs
如果你以root用户制作了任何一个contrib/程序:
make -C contrib/<SUBDIR-NAME> install
提示
如果您只打算使用PostgreSQL作为客户端连接到另一台机器上的服务器,那么您的安装已经完成,您不应该运行剩余的命令。
如果升级了现有数据库,请跳过其余命令,因为数据库已经可以使用了。如果这是您第一次安装PostgreSQL,请继续初始化。
使用root用户发出的以下命令初始化数据库集群:
install -v -dm700 /srv/pgsql/data &&
install -v -dm755 /run/postgresql &&
chown -Rv postgres:postgres /srv/pgsql /run/postgresql
现在,以root用户初始化数据库:
su - postgres -c '/usr/bin/initdb -D /srv/pgsql/data'
命令解释
sed -i …: 这个sed将服务器套接字位置从/tmp更改为/run/postgresql。
--enable-thread-safety: 这个开关允许libpq和ECPG程序中的并发线程安全地控制它们的私有连接句柄,从而使客户端库线程安全。
--with-openssl: 构建支持OpenSSL加密连接的包。
--with-perl: 构建PL/Perl服务器端语言。
--with-python: 构建PL/Python服务器端语言。默认使用Python3,不再支持Python2。
--with-tcl: 构建PL/Tcl服务器端语言。
配置 PostgreSQL
配置文件
$PGDATA/pg_ident.con, $PGDATA/pg_hba.conf, 和 $PGDATA/postgresql.conf
通过将PGDATA环境变量设置为包含所需集群的目录的值,可以使用它来区分数据库集群。这三个配置文件存在于每个PGDATA/目录中。有关文件格式的详细信息以及可以在每个文件中设置的选项可以在/usr/share/doc/postgresql-15.2/html/index.html中找到。
Systemd Unit
安装blfs-systemd-units-20220720包中的postgresql.service单元:
make install-postgresql
启动PostgreSQL服务器并创建样例数据库
数据库服务器可以用以下命令手动启动(以root用户):
su - postgres -c '/usr/bin/postgres -D /srv/pgsql/data > \
/srv/pgsql/data/logfile 2>&1 &'
注意
如果要编写此部分的脚本,则应该在继续之前等待服务器启动,例如在上述命令之后添加sleep 2。
下面的说明显示了如何创建数据库、向其中添加表、向表中插入一些行并选择它们,以验证安装是否正常工作。仍然作为用户root,问题:
su - postgres -c '/usr/bin/createdb test' &&
echo "create table t1 ( name varchar(20), state_province varchar(20) );" \
| (su - postgres -c '/usr/bin/psql test ') &&
echo "insert into t1 values ('Billy', 'NewYork');" \
| (su - postgres -c '/usr/bin/psql test ') &&
echo "insert into t1 values ('Evanidus', 'Quebec');" \
| (su - postgres -c '/usr/bin/psql test ') &&
echo "insert into t1 values ('Jesse', 'Ontario');" \
| (su - postgres -c '/usr/bin/psql test ') &&
echo "select * from t1;" | (su - postgres -c '/usr/bin/psql test')
当你完成测试,你可以关闭服务器,通过发出root:
su - postgres -c "/usr/bin/pg_ctl stop -D /srv/pgsql/data"
内容
安装程序: clusterdb, createdb, createuser, dropdb, dropuser, ecpg, initdb, pg_amcheck, pg_archivecleanup, pg_basebackup, pg_checksums, pg_config, pg_controldata, pg_ctl, pg_dump, pg_dumpall, pg_isready, pg_receivewal, pg_recvlogical, pg_resetwal, pg_restore, pg_rewind, pg_test_fsync, pg_test_timing, pg_upgrade, pg_verifybackup, pg_waldump, pgbench, postgres, postmaster (弃用), psql, reindexdb, vacuumdb, optionally, 如果建立了对Tcl的支持, pltcl_delmod, pltcl_listmod, pltcl_loadmod, 和可选 (在contrib/) oid2name, pg_standby, vacuumlo, 还有很多其他的
安装库: libecpg.{so,a}, libecpg_compat.{so,a}, libpgcommon.a, libpgcommon_shlib.a, libpgfeutils.a, libpgport.a, libpgport_shlib.a, libpgtypes.{so,a}, libpq.{so,a}, /usr/lib/postgresql 下的各种字符集模块和可选的编程语言模块
安装目录: /usr/include/{libpq,postgresql}, /usr/lib/postgresql, /usr/share/{doc/postgresql-15.2,postgresql}, 和 /srv/pgsql
简短描述
clusterdb 是一个用于重新聚集PostgreSQL数据库中的表的实用程序。
createdb 创建新的PostgreSQL数据库。
createuser 定义一个新的PostgreSQL用户帐户。
dropdb 删除一个PostgreSQL数据库。
dropuser 删除一个PostgreSQL用户帐户。
ecpg 是嵌入式SQL预处理器。
initdb 创建一个新的数据库集群。
oid2name 解析PostgreSQL数据目录中的OIDs (Object IDs)和文件节点。
pg_amcheck 检查一个或多个PostgreSQL数据库中的损坏。
pg_archivecleanup 清理PostgreSQL WAL(预写日志)归档文件。
pg_basebackup 对正在运行的PostgreSQL集群进行基本备份。
pg_checksums 启用、禁用或检查PostgreSQL数据库集群中的数据校验和。
pg_config 获取PostgreSQL版本信息。
pg_controldata 返回在initdb期间初始化的信息,例如目录版本和服务器区域设置。
pg_ctl 控制停止和启动数据库服务器。
pg_dump 将数据库数据和元数据转储到用于重新创建数据库的脚本中。
pg_dumpall 递归地为集群中的每个数据库调用pg_dump。
pg_isready 检查PostgreSQL服务器的连接状态。
pg_receivewal 用于从PostgreSQL服务器流化预写日志。
pg_recvlogical 控制PostgreSQL逻辑解码流。
pg_resetwal 重置PostgreSQL数据库集群的预写日志和其他控制信息。
pg_restore 从pg_dump创建的转储文件创建数据库。
pg_rewind 将一个PostgreSQL数据目录与另一个从第一个数据目录派生出来的数据目录同步。
pg_standby 支持创建PostgreSQL热备服务器。
pg_test_fsync 决定了PostgreSQL最快的wal_sync方法。
pg_test_timing 测量计时开销。
pg_upgrade 升级PostgreSQL服务器实例。
pg_verifybackup 验证PostgreSQL集群基本备份的完整性。
pg_waldump 显示PostgreSQL数据库集群的预写日志的人类可读呈现。
pgbench 在PostgreSQL上运行基准测试。
pltcl_delmod 是一个支持脚本,用于从PL/Tcl表中删除模块。该命令需要安装Pgtcl包。
pltcl_listmod 是一个支持脚本,用于列出PL/Tcl表中的模块。该命令需要安装Pgtcl包。
pltcl_loadmod 是一个支持脚本,用于将模块加载到PL/Tcl表中。该命令还需要安装Pgtcl包。
postgres 为PostgreSQL数据库服务器。
postmaster (已弃用,指向postgres的符号链接)是一个多用户数据库守护进程。
psql 是一个基于控制台的数据库shell。
reindexdb 是用于在数据库中重建索引的实用程序。
vacuumdb 压缩数据库并为查询分析器生成统计信息。
vacuumlo 从PostgreSQL数据库中删除孤立的大对象。
libecpg.{so,a} 包含在C程序中支持嵌入式SQL的函数。
libecpg_compat.{so,a} 是ecpg兼容性库。
libgport.a 是Postgres后端的端口特定子系统。
libpgtypes.{so,a} 包含处理Postgres数据类型的函数。
libpq.{so,a} 是C程序员对Postgres的API。
22.6 SQLite-3.40.1
简介SQLite
SQLite包是一个软件库,它实现了一个自包含的、无服务器的、零配置的事务性SQL数据库引擎。
已知此包可以使用LFS 11.3平台进行构建并正常工作。
包信息
-
下载 (HTTP): https://sqlite.org/2022/sqlite-autoconf-3400100.tar.gz
-
下载 MD5 校验和: 42175b1a1d23529cb133bbd2b5900afd
-
下载大小: 3.0 MB
-
预计所需磁盘空间: 78 MB
-
预计构建时间: 0.3 SBU (使用并行数=4)
额外下载
可选文档
-
下载 MD5 校验和: f4cc9073ea45b01f62b9652e5e28a383
-
下载大小: 11 MB
SQLite 依赖
可选
用户笔记: https://wiki.linuxfromscratch.org/blfs/wiki/sqlite
安装SQLite
如果你下载了可选的文档,发出以下命令将文档安装到源代码树中:
unzip -q ../sqlite-doc-3400100.zip
运行如下命令安装SQLite:
./configure --prefix=/usr \
--disable-static \
--enable-fts5 \
CPPFLAGS="-DSQLITE_ENABLE_FTS3=1 \
-DSQLITE_ENABLE_FTS4=1 \
-DSQLITE_ENABLE_COLUMN_METADATA=1 \
-DSQLITE_ENABLE_UNLOCK_NOTIFY=1 \
-DSQLITE_ENABLE_DBSTAT_VTAB=1 \
-DSQLITE_SECURE_DELETE=1 \
-DSQLITE_ENABLE_FTS3_TOKENIZER=1" &&
make
这个包没有附带测试套件。
现在,作为root用户:
make install
如果你下载了可选的文档,以root用户发出以下命令来安装它:
install -v -m755 -d /usr/share/doc/sqlite-3.40.1 &&
cp -v -R sqlite-doc-3400100/* /usr/share/doc/sqlite-3.40.1
命令解释
--disable-static: 此开关防止安装库的静态版本。
--enable-fts5: 这个开关支持全文搜索扩展的版本5。
CPPFLAGS="-DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS3_TOKENIZER=1 -DSQLITE_ENABLE_FTS4=1 -DSQLITE_ENABLE_COLUMN_METADATA=1 -DSQLITE_SECURE_DELETE -DSQLITE_ENABLE_UNLOCK_NOTIFY=1 -DSQLITE_ENABLE_DBSTAT_VTAB=1": 像SeaMonkey这样的应用程序需要打开这些选项。这样做的唯一方法是将它们包含在CFLAGS或CPPFLAGS中。我们使用后者,所以CFLAGS的默认值(或用户设置的任何值)不会受到影响。有关可指定内容的进一步信息,请参阅https://www.sqlite.org/compile.html。
内容
安装程序: sqlite3
安装库: libsqlite3.so
安装目录: /usr/share/doc/sqlite-3.40.1
简短描述
sqlite3 是SQLite库的基于终端的前端,可以交互式地评估查询并显示结果。
libsqlite3.so 包含SQLite API函数。