postgresql 17编译安装详解与实战

本文章内容描述从源代码发布安装PostgreSQLCentOS Stream 9上编译安装PostgreSQL 17。

  1. 要求
    1. 1  编译PostgreSQL需要下列软件包:
  • 要求GNU make版本3.80或以上;其他的make程序或更老的GNU make版本将不会工作(GNU make有时以名字gmake安装)。要测试GNU make可以输入:

        make –version

  • 你需要一个ISO/ANSI C 编译器(至少是 C99兼容的)。我们推荐使用最近版本的GCC。
  • 需要flex 2.5.35或更高版本,Bison 2.3或更高版本。不能使用其他lex和yacc程序。
  • 在构建过程中需要Perl 5.14或更高版本,并运行一些测试套件。
  • 默认使用GNU Readline库。它允许psql( PostgreSQL命令行SQL解释器)记住您输入的每个命令,并允许您使用箭头键来回忆和编辑以前的命令。如果您不想使用它,则必须在 configure中指定--without-readline选项。您通常可以使用BSD许可的libedit库作为替代,最初 在NetBSD上开发。如果找不到libreadline,或者 使用--with-libedit-preferred作为 configure的选项,则使用libedit库。
  • 默认使用zlib压缩库。如果你不想使用它,那么你必须指定配置的——without-zlib选项。使用此选项将禁用对压缩的支持pg_dump和pg_restore中的归档。
  • 默认使用ICU库。如果不想使用它,那么必须指定——without-icu选项进行配置。使用此选项将禁用对ICU排序功能的支持。

        ​​​​​​​        1.2 可选包:

  • 要构建服务器编程语言PL/Perl,您需要完整的Perl安装,包括Libperl库和头文件。所需的最低版本是Perl 5.14。
  • 要构建PL/Python服务器编程语言,您需要使用头文件和sysconfig模块。最低要求的版本是Python 3.2。
  • 要构建PL/Tcl过程语言,当然需要安装Tcl。最小需要的版本是Tcl 8.4。
  • 启用本地语言支持(Native Language Support, NLS),即能够以除了英语之外的其他语言,您需要Gettext API的实现
  • 如果你想支持加密的客户端连接,你需要OpenSSL。最低要求的版本是1.0.2。
  • 如果希望支持身份验证,则需要MIT Kerberos(用于GSSAPI)、OpenLDAP和/或PAM使用这些服务进行认证。
  • Zstandard,如果你想用这个方法支持数据压缩,看wal_com_pression。最低要求的版本是1.4.0。
  • 要构建PostgreSQL文档,有一组单独的要求。

2. 获取源码

        https://ftp.postgresql.org/pub/source/v17.1/postgresql-17.2.tar.gz

3. 安装过程

        

3.1 配置

        ./configure 该脚本将运行许多测试来确定各种系统相关变量的值并检测操作系统的依赖变量,最后将在构建中创建几个文件树来记录它。默认时所有文件都将安装到/usr/local/pgsql

       如果你想保持编译目录的独立,你也可以在一个源码树之外的目录中运行configure ,然后在那里构建。这个过程也被称为一个VPATH编译。做法如下:

        mkdir build_dir

        cd build_dir

        /path/to/source/tree/configure [options go here]

        make

        3.2 Build

        make

        make install

  • make world构建可以构建的所有内容,包括文档(HTML 和手册页)和附加模块(contrib)。
  • make world-bin构建可以构建的所有内容,和附加模块,除了文档。
  • 如果要从另一个 makefile 调用构建而不是手动调用,则必须取消设置MAKELEVEL或将其设置为零,例如:

build-postgresql:

       $(MAKE) -C postgresql MAKELEVEL=0 all

        3.3 回归测试

make check  如果您想在安装之前测试新构建的服务器,您可以在此时运行回归测试。 回归测试是一个测试套件,用于验证PostgreSQL 是否以开发人员期望的方式在您的机器上运行。

​​​​​​​​​​​​​​        3.4 安装文件

        make install 这会将文件安装到配置中指定的目录中。需要以 root 身份执行此步骤。 或者,您可以提前创建目标目录并安排授予适当的权限。

  • make install-docs 安装文档(HTML 和手册页)
  • make install-world 如果您构建了上面的文档,这也会安装文档。
  • make install-world-bin 建除上述文档之外的所有内容。
  • 可以使用make install-strip而不是 make install来剥离安装的可执行文件和库。这将节省一些空间。但它不知道如何从可执行文件中去除每个不需要的字节。

        标准安装提供了客户机应用程序开发所需的所有头文件,以及用于服务器端程序开发,例如用C编写自定义函数或数据类型。

​​​​​​​​​​​​​​        3.5 仅安装客户端

        只想安装客户端应用程序和接口库:

        make -C src/bin install

        make -C src/include install

        make -C src/interfaces install

        make -C doc install

        卸载:要撤消安装,请使用命令make uninstall。但是,这不会删除任何创建的目录。

        清理:

  • make clean 安装后,通过使用命令从源树中删除构建的文件来释放磁盘空间。 这将保留configure程序生成的文件,以便您稍后可以使用make重建所有内容。
  • make distclean将代码树重置为分发时的状态。如果要在同一源代码树中为多个平台构建, 则必须执行此操作并为每个平台重新配置。如果您执行构建然后发现您的configure选项错误,或者如果您更改了configure调查的任何内容(例如,软件升级),那么在重新配置和重建之前执行make distclean是个好主意。

4. configure 选项

​​​​​​​        ​​​​​​4.1安装位置

        --prefix=PREFIX 把所有文件装在目录PREFIX中而不是/usr/local/pgsql中。

        --exec-prefix=EXEC-PREFIX 把体系相关的文件安装到一个不同的前缀下(EXEC-PREFIX),而不是PREFIX中设置的地方。 这样做可以比较方便地在不同主机之间共享体系相关的文件

        --bindir=DIRECTORY 为可执行程序指定目录。默认是EXEC-PREFIX/bin 通常也就是/usr/local/pgsql/bin

        --sysconfdir=DIRECTORY 各种各样配置文件的目录,默认为PREFIX/etc

        --libdir=DIRECTORY 设置安装库和动态装载模块的目录。默认是EXEC-PREFIX/lib

        --includedir=DIRECTORY  C C++ 头文件的目录。默认是PREFIX/include

        --datarootdir=DIRECTOR  设置多种只读数据文件的根目录。这只为后面的某些选项设置默认值。默认值为PREFIX/share

        --datadir=DIRECTORY  设置被安装的程序使用的只读数据文件的目录。默认值为DATAROOTDIR。注意这不会对你的数据库文件被放置的位置产生任何影响。

        --localedir=DIRECTORY  设置安装区域数据的目录,特别是消息翻译目录文件。默认值为DATAROOTDIR/locale

        --mandir=DIRECTORY PostgreSQL自带的手册页将安装到这个目录,它们被安装在相应的manx子目录里。 默认是DATAROOTDIR/man

        --docdir=DIRECTORY  置安装文档文件的根目录,“man”页不包含在内。

        --htmldir=DIRECTORY  PostgreSQLHTML格式的文档将被安装在这个目录中。

​​​​​​​​​​​​​​        4.2 PostgreSQL 特性

        --enable-nls[=LANGUAGES]   打开本地语言支持(NLS),也就是以非英文显示程序消息的能力。

        --with-perl 制作PL/Perl服务器端编程语言。

        --with-python 制作PL/Python服务器端编程语言。

        --with-tcl制作PL/Tcl服务器编程语言。

        --with-tclconfig=DIRECTORY  Tcl 安装文件tclConfig.sh,其中里面包含编译与 Tcl 接口的模块的配置信息。该文件通常可以自动地在一个众所周知的位置找到,但是如果你需要一个不同版本的 Tcl 您可以指定在其中查找tclConfig.sh的目录。

        --with-icu 构建时支持ICU 库,从而能够使用 ICU 整理功能。

        --with-llvm  支持基于LLVMJIT编译。

        --with-lz4     使用LZ4压缩支持构建。

        --with-zstd   使用Zstandard压缩支持构建。

        --with-ssl=LIBRARY  编译SSL(加密)连接支持。唯一支持的LIBRARY openssl

        --with-openssl

        --with-gssapi  构建支持 GSSAPI 身份验证。

        --with-ldap  为认证和连接参数查找编译LDAP支持  Unix 上,这需要安装OpenLDAP包。在 Windows 上将使用默认的WinLDAP库。

        --with-pam  使用PAM(可插拔身份验证模块)支持构建。

        --with-bsd-auth  使用 BSD 身份验证支持构建。(BSD 身份验证框架目前仅在 OpenBSD 上可用。)

        --with-systemd  编译对systemd 服务通知的支持。如果服务器是在systemd 机制下被启动,这可以提高集成度,否则不会有影响 

        --with-bonjour  构建支持 Bonjour 自动服务发现。

        --with-uuid=LIBRARY 使用指定的 UUID 库编译uuid-ossp模块(提供生成 UUID 的函数)。

        --with-libxml 使用 libxml2 构建,启用 SQL/XML 支持。

--with-libxslt 使用 libxslt 构建,使xml2模块能够执行 XML XSL 转换。

​​​​​​​​​​​​​​        4.3 Anti-Features

        除非确实有必要,否则不建议使用这些选项。

        --without-readline   防止使用Readline库(以及libedit)。 此选项禁用psql中的命令行编辑和历史记录。

        --with-libedit-preferred 赞成使用 BSD 许可的libedit库而不是 GPL 许可的Readline 仅当您安装了两个库时,此选项才有意义; 这种情况下的默认设置是使用Readline

        --without-zlib 防止使用Zlib库。这将禁用对pg_dump pg_restore中压缩档案的支持。

        --disable-spinlocks 即便PostgreSQL对于该平台没有 CPU 自旋锁支持,也允许编译成功。自旋锁支持的缺乏会导致非常差的性能,因此这个选项只有当编译终端或者通知你该平台缺乏自旋锁支持时才应被使用。如果在你的平台上要求使用该选项来编译PostgreSQL,请将此问题报告给PostgreSQL的开发者。

        --disable-atomics 禁用 CPU 原子操作。 此选项在缺少此类操作的平台上不起作用。 在具有它们的平台上,这将导致性能不佳。 此选项仅用于调试或进行性能比较。

        --disable-thread-safety 禁用客户端库的线程安全性。这会阻止libpqECPG程序中的并发线程安全地控制它们私有的连接句柄。仅在线程支持不足的平台上使用它。

​​​​​​​​​​​​​​        4.4 构建过程详细信息

        --with-includes=DIRECTORIES DIRECTORIES是一个以冒号分隔的目录列表,这些目录将被添加到编译器搜索头文件的列表中。 

例子:--with-includes=/opt/gnu/include:/usr/sup/include.

        --with-libraries=DIRECTORIES

        DIRECTORIES是用于搜索库的以冒号分隔的目录列表。 如果您在非标准位置安装了软件包,您可能必须使用此选项(以及相应的--with-includes选项)。 installed in non-standard locations.

        例子:--with-libraries=/opt/gnu/lib:/usr/sup/lib.

        --with-system-tzdata=DIRECTORY

        PostgreSQL包含它自己的时区数据库,它被用于日期和时间操作。

        --with-extra-version=STRING

        将STRING附加到 PostgreSQL 版本号。

        --disable-rpath

        不要标记PostgreSQL的可执行文件以表明它们应该在安装的库目录中搜索共享库(请参阅--libdir)。

​​​​​​​​​​​​​​        ​​​​​​​4.5  杂项

        --with-pgport=NUMBER  将NUMBER设置为服务器和客户端的默认端口号。默认为 5432。

        --with-krb-srvnam=NAME    GSSAPI 使用的 Kerberos 服务主体的默认名称。postgres是默认值。 通常没有理由更改它,除非您是为 Windows 环境构建的,在这种情况下,它必须设置为大写POSTGRES

        --with-segsize=SEGSIZE 设置segment size,以千兆字节为单位。大表被分成多个操作系统文件,每个文件的大小等于段的大小。 这避免了许多平台上存在的文件大小限制问题。默认段大小 1 GB 在所有支持的平台上都是安全的。 如果您的操作系统支持“largefile”(现在大多数都支持),您可以使用更大的段大小。 这有助于减少处理非常大的表时消耗的文件描述符的数量。但请注意不要选择大于您的平台和您打算使用的文件系统支持的值。 您可能希望使用的其他工具,例如tar,也可以设置可用文件大小的限制。 建议(虽然不是绝对要求)此值是 2 的幂。 请注意,更改此值会破坏磁盘数据库兼容性,这意味着您不能使用pg_upgrade升级到具有不同段大小。

        --with-blocksize=BLOCKSIZE  设置block size,以千字节为单位。这是表中的存储和 I/O 默认值为 8 KB,适用于大多数情况; 但其他值在特殊情况下可能有用。 该值必须是 1 32(千字节)之间的 2 的幂。 请注意,更改此值会破坏磁盘数据库兼容性,这意味着您不能使用pg_upgrade升级到具有不同块大小的构建。

        --with-wal-blocksize=BLOCKSIZE  设置WAL block size,以千字节为单位。这是 WAL 日志中的存储和 I/O 单元。 默认值为 8 KB,适用于大多数情况; 但其他值在特殊情况下可能有用。该值必须是 1 64(千字节)之间的 2 的幂。 请注意,更改此值会破坏磁盘数据库兼容性,这意味着您不能使用pg_upgrade升级到具有不同 WAL 块大小的构建。

​​​​​​​​​​​​​​        4.6 Developer Options

        本节中的大多数选项仅适用于开发或调试PostgreSQL 除了--enable-debug之外,不建议将它们用于生产版本,这对于在遇到错误的不幸事件中启用详细的错误报告非常有用。 在支持 DTrace 的平台上,在生产中使用--enable-dtrace也可能是合理的。

         在构建将用于在服务器内部开发代码的安装时,建议至少使用选项--enable-debug --enable-cassert

  --enable-debug

        把所有程序和库以带有调试符号的方式编译。这意味着你可以通过一个调试器运行程序来分析问题。 这样做显著增大了最后安装的可执行文件的大小,并且在非 GCC 的编译器上,这么做通常还要关闭编译器优化, 这些都导致速度的下降。但是,如果有这些符号的话,就可以非常有效地帮助定位可能发生问题的位置。目前,我们只是在你使用 GCC 的情况下才建议在生产安装中使用这个选项。但是如果你正在进行开发工作,或者正在使用 beta 版本,那么你就应该总是打开它。

   --enable-cassert

打开在服务器中的assertion检查, 它会检查许多不可能发生的条件。

   --enable-tap-tests

使用 Perl TAP 工具启用测试。 这需要 Perl 安装和 Perl 模块IPC::Run 

   --enable-depend

打开自动倚赖性跟踪。

   --enable-coverage

如果使用 GCC,则所有程序和库都使用代码覆盖测试工具进行编译。 运行时,它们会在构建目录中生成带有代码覆盖率指标的文件。 

   --enable-profiling

如果使用 GCC,则会编译所有程序和库,以便对其进行分析。 在后端退出时,将创建一个子目录,其中包含包含配置文件数据的gmon.out文件。 此选项仅用于 GCC 和进行开发工作时。

   --enable-dtrace

PostgreSQL编译对动态跟踪工具 DTrace 的支持。

5. initdb选项

        initdb PostgreSQL 中用来初始化数据库集群的命令。在你运行 initdb 之前,确保你有适当的权限,并且没有其他 PostgreSQL 实例正在运行。

        -A authmethod

                --auth=authmethod 这个选项为本地用户指定在pg_hba.conf中使用的默认认证方法 (host和local行)。initdb将使用指定的认证方法为非复制连接以及复制连接填 充pg_hba.conf项。

        --auth-host=authmethod 这个选项为通过 TCP/IP (host行)。

        --auth-local=authmethod 连接的本地用户指定在pg_hba.conf中使用的认证方法 这个选项为通过 Unix 域套接字连接的本地用户指定在pg_hba.conf中使用的认证方法 (local行)。

        -D directory--pgdata=directory 这个选项指定数据库集簇应该存放的目录。这是initdb要求的唯一信息,但是你可以通 过设定PGDATA环境变量来避免书写它,这很方便因为之后数据库服务器(postgres)可 以使用同一个变量来找到数据库目录。

        -E encoding

        --encoding=encoding

        选择模板数据库的编码。这也将是后来创建的任何数据库的默认编码,除非你覆盖它。 默认值来自于区域,或者如果该值不起作用则为SQL_ASCII。

        -g

        --allow-group-access 允许与集群所有者在同一组中的用户读取initdb创建的所有集群文件。此选项在Windows上被忽略,因为它不支持posix风格的组权限。

        --icu-locale=locale

        指定使用ICU提供程序时的ICU区域设置。

        --icu-rules=rules

        指定其他排序规则,以自定义默认排序规则的行为。这是仅支持ICU。

        -k

        --data-checksums

        在数据页上使用校验和来帮助检测I/O系统造成的损坏。启用校验可能会导致明显的性能损失。如果设置,将为数据库中的所有对象进行计算而校验。所有校验和失败都将在中报告pg_stat_database视图。

        --locale=locale

        设置数据库集群的默认区域设置。如果未指定此选项,则继承区域设置从initdb运行的环境中获取。

        如果--locale-provider是内置的,那么必须指定--locale或--built –locale必须指定并设置为C或C.UTF-8。

        --lc-collate=locale

        --lc-ctype=locale

        --lc-messages=locale

        --lc-monetary=locale

        --lc-numeric=locale

        --lc-time=locale

        类似--locale, 但只设置指定类别中的区域设置。.

        --no-locale

        等于 --locale=C.

        --builtin-locale=locale

        指定使用内置提供程序时的区域设置名称。

        --locale-provider={builtin|libc|icu}

        此选项为在新集群中创建的数据库设置区域设置提供程序。之后创建新数据库时使用CREATE DATABASE命令它可以被覆盖在。默认的是libc。

        --pwfile=filename

        使initdb从文件中读取引导超级用户的密码。文件的第一行是作为密码。

        -T config--text-search-config=config

        设置默认文本搜索配置。

        -W

        --pwprompt

        让initdb提示bootstrap超级用户输入密码。

        -X directory--waldir=directory

        该选项指定应该存储预写日志的目录

        --wal-segsize=size

        设置WAL段大小,以兆字节为单位。这是WAL日志中每个单独文件的大小。默认大小为16兆字节。取值为1 ~ 1024之间2的幂,单位为兆字节。此选项只能在初始化时设置,以后不能更改。

        调整此大小以控制WAL日志传送或归档的粒度可能很有用。此外,在具有大量WAL的数据库中,每个目录的WAL文件的绝对数量可以成为一个性能和管理问题。增加WAL文件大小将减少WAL文件数。

        -?

        --help

        获得帮助。

        还有些不常用的。

6. 编译安装实战

​​​​​​​​​​​​​​        6.1 源码包下载

        PostgreSQL: File Browser

选择V17.2, 下载源码包postgresql-17.2.tar.gz

​​​​​​​​​​​​​​        6.2 关闭防火墙和selinux

        [root@pgserver01 ~]# cat /etc/redhat-release

        [root@pgserver01 ~]# systemctl stop firewalld

        [root@pgserver01 ~]# systemctl status firewalld

        [root@pgserver01 ~]# systemctl disable firewalld

       [root@pgserver01 ~]# vi /etc/selinux/config

                                       SELINUX=disabled

        [root@pgserver01 ~]# set enforce 0

​​​​​​​​​​​​​​        6.3 本地yum源配置

        先备份yum repo文件

        [root@pgserver01 ~]# mkdir -p /etc/yum.repos.d/repobak

        [root@pgserver01 ~]# cp /etc/yum.repos.d/*repo /etc/yum.repos.d/repobak/

        [root@pgserver01 ~]# vim /etc/yum.repos.d/Centos.repo

        [baseos]

        name=CentOS Stream $releasever - BaseOS

        baseurl=https://mirrors.aliyun.com/centos-stream/$stream/BaseOS/$basearch/os/

        gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

        gpgcheck=1

        repo_gpgcheck=0

        metadata_expire=6h

        countme=1

        enabled=1

        [appstream]

        name=CentOS Stream $releasever - AppStream

        baseurl=https://mirrors.aliyun.com/centos-stream/$stream/AppStream/$basearch/os/

        gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial

        gpgcheck=1

        repo_gpgcheck=0

        metadata_expire=6h

        countme=1

        enabled=1

        [root@pgserver01 ~]# dnf clean all

        [root@pgserver01 ~]# dnf makecache

        [root@pgserver01 ~]# dnf update

​​​​​​​​​​​​​​        ​​​​​​​6.4 安装依赖包

        [root@pgserver01 ~]# dnf install -y gcc gcc-c++ make zlib-devel openssl-devel readline-devel libxml2-devel libxslt-devel python-devel tcl-devel

        [root@pgserver01 ~]# dnf install -y libicu libicu-devel

        [root@pgserver01 ~]# dnf install -y bison flex perl-CPAN

​​​​​​​​​​​​​​        6.5 创建用户,用户组和安装目录

        [root@pgserver01 ~]# groupadd postgres

        [root@pgserver01 ~]# useradd -g postgres postgres

        [root@pgserver01 ~]# echo "postgres" | passwd --stdin postgres

        [root@pgserver01 ~]# mkdir -p /opt/pgsql/data

        [root@pgserver01 ~]# chown -R postgres:postgres /opt/pgsql

​​​​​​​​​​​​​​        6.6 编译源码安装

        [root@pgserver01 ~]# su – postgres

        [postgres@pgserver01 ~]$ tar zxvf postgresql-17.2.tar.gz -C /opt/pgsql 

        [postgres@pgserver01 ~]$ cd /opt/pgsql/postgresql-17.2

       [postgres@pgserver01 postgresql-17.2]$ ./configure --prefix=/opt/pgsql --with-openssl --with-readline

[postgres@pgserver01 postgresql-17.2]$ make

[postgres@pgserver01 postgresql-17.2]$ make install

​​​​​​​​​​​​​​        6.7 配环境变量

        [postgres@pgserver01 postgresql-17.2]$ cd ~

        [postgres@pgserver01 ~]$ cat >>~/.bash_profile <<"EOF"

        export PGHOME=/opt/pgsql

        export PGDATA=/opt/pgsql/data

        export PGPORT=5432

        export PATH=$PGHOME/bin:$PATH:.

        EOF

        postgres@pgserver01 ~]$ source .bash_profile

​​​​​​​​​​​​​​        6.8 初始化数据库

        [postgres@pgserver01 ~]$ initdb -D $PGDATA --data-checksums --pwprompt

        

​​​​​​​​​​​​​​        6.9 修改配置文件

        [postgres@pgserver01 ~]$ cp $PGDATA/pg_hba.conf $PGDATA/pg_hba.conf.bak

        [postgres@pgserver01 ~]$ vi $PGDATA/pg_hba.conf

          修改

          local  all  postgres  trust

          host    all             all             0.0.0.0/0               scram-sha-256

          hostssl  all            all             0.0.0.0/0               scram-sha-256

        

        [postgres@pgserver01 ~]$ vi $PGDATA/postgresql.conf

           listen_addresses ='*'

           port = 5432

​​​​​​​​​​​​​​        ​​​​​​​6.10 启动并登陆数据库

        [postgres@pgserver01 ~]$ pg_ctl -D $PGDATA -l logfile start

​​​​​​​

查看postgresql端口

[postgres@pgserver01 ~]$ netstat -nlutp

[postgres@pgserver01 ~]$ pg_ctl status

[postgres@pgserver01 ~]$ psql

postgres=# select version();

postgres=# select * from pg_hba_file_rules;

 

​​​​​​​​​​​​​​        6.11 配置自动启动

        [root@pgserver01 opt]# vi /etc/systemd/system/postgresqld.service

         [Unit]

        Description=PostgreSQL database server

        After=network.target

        [Service]

        Type=forking

        User=postgres

        Group=postgres

       # 注意:这里的路径需要根据你的安装路径进行调整

       ExecStart=/opt/pgsql/bin/pg_ctl start -D /opt/pgsql/data

       ExecStop=/opt/pgsql/bin/pg_ctl stop -s -D /opt/pgsql/data

       ExecReload=/bin/kill -HUP $MAINPID

      [Install]

      WantedBy=multi-user.target

     [root@pgserver01 opt]# systemctl daemon-reload

     [root@pgserver01 opt]# systemctl enable postgresqld

     启动服务

    [root@pgserver01 opt]# systemctl start postgresqld

    查看服务状态

    [root@pgserver01 ~]# systemctl status postgresqld

    

   停止服务

   [root@pgserver01 opt]# systemctl stop postgresqld

安装已经成功,但以上的配置不适用生产环境

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值