W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
pg_upgrade — 升級(jí)PostgreSQL服務(wù)器實(shí)例
pg_upgrade
-b
oldbindir
-B
newbindir
-d
oldconfigdir
-D
newconfigdir
[option
...]
pg_upgrade(之前被稱為pg_migrator) 允許存儲(chǔ)在PostgreSQL數(shù)據(jù)文件中的數(shù)據(jù)被升級(jí)到一個(gè)較晚 的PostgreSQL主版本而無需進(jìn)行主版本升級(jí)(例如從9.5.8到9.6.4或者從10.7到11.2)通常所需的數(shù)據(jù)轉(zhuǎn)儲(chǔ)/重載。 對(duì)于次版本升級(jí)(例如從9.6.2到9.6.3或者從10.1到10.2)則不需要這個(gè)程序。
主 PostgreSQL 發(fā)行通常會(huì)加入新的特性,這些新特性常常會(huì)更改系統(tǒng)表的 布局,但是內(nèi)部數(shù)據(jù)存儲(chǔ)格式很少會(huì)改變。pg_upgrade 使用這一事實(shí)來通過創(chuàng)建新系統(tǒng)表并且重用舊的用戶數(shù)據(jù)文件來執(zhí)行快速升級(jí)。 如果一個(gè)未來的主發(fā)行沒有把數(shù)據(jù)存儲(chǔ)格式改得讓舊數(shù)據(jù)格式不可讀取,這類 升級(jí)就用不上pg_upgrade(社區(qū)將嘗試避免這類情況)。
pg_upgrade會(huì)盡力(例如通過檢查兼容的編譯時(shí)設(shè) 置)確保新舊集簇在二進(jìn)制上也是兼容的,包括 32/64 位二進(jìn)制。保持 外部模塊也是二進(jìn)制兼容的也很重要,不過 pg_upgrade無法檢查這一點(diǎn)。
pg_upgrade 支持從 8.4.X 及其后版本升級(jí)到當(dāng)前的 PostgreSQL主發(fā)布,包括快照和 beta 發(fā)布。
pg_upgrade接受下列命令行參數(shù):
-b
bindir
--old-bindir=
bindir
舊的 PostgreSQL 可執(zhí)行文件目錄; 環(huán)境變量PGBINOLD
-B
bindir
--new-bindir=
bindir
新的 PostgreSQL 可執(zhí)行文件目錄; 默認(rèn)為pg_upgrade所在的目錄; 環(huán)境變量PGBINNEW
-c
--check
只檢查集簇,不更改任何數(shù)據(jù)
-d
configdir
--old-datadir=
configdir
舊的集簇?cái)?shù)據(jù)目錄;環(huán)境變量 PGDATAOLD
-D
configdir
--new-datadir=
configdir
新的集簇?cái)?shù)據(jù)目錄;環(huán)境變量 PGDATANEW
-j
--jobs=njobs
要同時(shí)使用的進(jìn)程或線程數(shù)
-k
--link
使用硬鏈接來代替將文件拷貝到新集簇
-o
options
--old-options
options
直接傳送給舊 postgres
命令的選項(xiàng),多個(gè)選項(xiàng)可以追加在后面
-O
options
--new-options
options
直接傳送給新 postgres
命令的選項(xiàng),多個(gè)選項(xiàng)可以追加在后面
-p
port
--old-port=
port
舊的集簇端口號(hào);環(huán)境變量 PGPORTOLD
-P
port
--new-port=
port
新的集簇端口號(hào);環(huán)境變量 PGPORTNEW
-r
--retain
即使在成功完成后也保留 SQL 和日志文件
-s
dir
--socketdir=
dir
用于升級(jí)期間postmaster套接字的目錄;默認(rèn)是當(dāng)前目錄; 環(huán)境變量 PGSOCKETDIR
-U
username
--username=
username
集簇的安裝用戶名;環(huán)境變量 PGUSER
-v
--verbose
啟用詳細(xì)的內(nèi)部日志
-V
--version
顯示版本信息,然后退出
--clone
使用有效的文件克隆(在一些系統(tǒng)上也被稱為“reflinks”),而不是將文件拷貝到新群集。 這可以導(dǎo)致數(shù)據(jù)文件接近瞬時(shí)的復(fù)制,從而獲得-k
/--link
的速度優(yōu)勢(shì),同時(shí)保留舊群集不受影響。
文件克隆僅在某些操作系統(tǒng)和文件系統(tǒng)上得到支持。如果選中但不被支持,則 pg_upgrade運(yùn)行將會(huì)出錯(cuò)。 目前,它支持在Linux(內(nèi)核4.5或更高版本)上的Btrfs和XFS(在文件系統(tǒng)創(chuàng)建reflink支持),以及macOS上的APFS。
-?
--help
顯示幫助,然后退出
下面是用pg_upgrade執(zhí)行一次升級(jí)的步驟:
移動(dòng)舊集簇(可選)
如果你在使用一個(gè)與版本相關(guān)的安裝目錄(例如 /opt/PostgreSQL/13
),你就不需要移動(dòng)舊的集簇。 圖形化的安裝程序會(huì)使用版本相關(guān)的安裝目錄。
如果你的安裝目錄不是版本相關(guān)的(例如/usr/local/pgsql
), 就有必要移動(dòng)當(dāng)前的 PostgreSQL 安裝目錄,以免它干擾新的 PostgreSQL安裝。一旦當(dāng)前的 PostgreSQL服務(wù)器被關(guān)閉,就可以安全地重命名 PostgreSQL 安裝目錄。假設(shè)舊目錄是 /usr/local/pgsql
,你可以這樣:
mv /usr/local/pgsql /usr/local/pgsql.old
來重命名該目錄。
對(duì)于源碼安裝,編譯新版本
用兼容舊集簇的configure
標(biāo)記編譯新的 PostgreSQL 源碼。在開始升級(jí)之前,pg_upgrade
將檢查pg_controldata
來確保所有設(shè)置都是兼容的。
安裝新的 PostgreSQL 二進(jìn)制文件
安裝新服務(wù)器的二進(jìn)制文件和支持文件。pg_upgrade 會(huì)被包含在默認(rèn)的安裝中。
對(duì)于源碼安裝,如果你希望把新服務(wù)器安裝在一個(gè)自定義的位置, 可以使用prefix
變量:
make prefix=/usr/local/pgsql.new install
初始化新的 PostgreSQL 集簇
使用initdb
初始化新集簇。這里也要使用與 舊集簇相兼容的initdb
標(biāo)志。許多預(yù)編譯的 安裝程序會(huì)自動(dòng)做這個(gè)步驟。這里沒有必要啟動(dòng)新集簇。
安裝自定義的共享對(duì)象文件
把舊集簇使用的所有自定義共享對(duì)象文件(或者 DLL)安裝到新集簇中, 例如pgcrypto.so
,不管它們是來自于 contrib
還是某些其他源碼。不要安裝模式定義 (例如CREATE EXTENSION pgcrypto
),因?yàn)檫@些將會(huì)從舊集簇升級(jí)得到。 還有,任何自定義的全文搜索文件(詞典、同義詞、辭典、停用詞)也必須
被復(fù)制到新集簇中。
調(diào)整認(rèn)證
pg_upgrade
將會(huì)多次連接到舊服務(wù)器和新服務(wù)器,因此 你可能想要在pg_hba.conf
中把認(rèn)證設(shè)置成 peer
或者使用一個(gè)~/.pgpass
文件(見 第 33.15 節(jié))。
停止兩個(gè)服務(wù)器
確認(rèn)兩個(gè)數(shù)據(jù)庫服務(wù)器都被停止使用,例如在 Unix 上可以:
pg_ctl -D /opt/PostgreSQL/9.6 stop
pg_ctl -D /opt/PostgreSQL/13 stop
或者在 Windows 上使用正確的服務(wù)名:
NET STOP postgresql-9.6
NET STOP postgresql-13
直到后面的步驟之前,流復(fù)制和日志傳送后備服務(wù)器可以保持運(yùn)行。
為后備服務(wù)器升級(jí)做準(zhǔn)備
如果正在使用小節(jié)步驟 10中給出的方法升級(jí)后備服務(wù)器,請(qǐng)對(duì)舊的主集簇和后備集簇運(yùn)行pg_controldata以驗(yàn)證舊的后備服務(wù)器已經(jīng)完全追上。驗(yàn)證“Latest checkpoint location”值在所有集簇中都匹配(如果舊后備服務(wù)器在舊的主服務(wù)器之前被關(guān)閉或者如果舊的后備服務(wù)器仍在運(yùn)行,則將會(huì)出現(xiàn)失配)。此外,請(qǐng)確保在新的主集簇上的
postgresql.conf
文件中,wal_level
未設(shè)置為minimal
。
運(yùn)行 pg_upgrade
總是應(yīng)該運(yùn)行新服務(wù)器而不是舊服務(wù)器的pg_upgrade二進(jìn)制文件。 pg_upgrade要求制定新舊集簇的數(shù)據(jù)和可執(zhí)行文件(bin
)目錄。 你也可以指定用戶和端口值,以及你是否想要用鏈接或克隆來取代默認(rèn)的復(fù)制行為對(duì)數(shù)據(jù)文件進(jìn)行處理。
如果你使用鏈接模式,升級(jí)將會(huì)快很多(不需要文件拷貝)并且將使用 更少的磁盤空間,但是在升級(jí)后一旦啟動(dòng)新集簇,舊集簇就無法被訪問。 鏈接模式也要求新舊集簇?cái)?shù)據(jù)目錄位于同一個(gè)文件系統(tǒng)中(表空間和 pg_wal
可以在不同的文件系統(tǒng)中)。 克隆模式提供了相同的速度以及磁盤空間優(yōu)勢(shì),但不會(huì)導(dǎo)致新群集啟動(dòng)后舊群集不可用。 克隆模式還需要新舊數(shù)據(jù)目錄位于同一文件系統(tǒng)中。 此模式僅在某些操作系統(tǒng)和文件系統(tǒng)上可用。
--jobs
選項(xiàng)允許多個(gè) CPU 核心被用來復(fù)制/鏈接文件以及 并行地轉(zhuǎn)儲(chǔ)和重載數(shù)據(jù)庫模式。這個(gè)選項(xiàng)一個(gè)比較好的值是 CPU 核心數(shù) 和表空間數(shù)的最大值。這個(gè)選項(xiàng)可以顯著地減少升級(jí)運(yùn)行在一臺(tái)多處理 器機(jī)器上的多數(shù)據(jù)庫服務(wù)器的時(shí)間。
對(duì)于 Windows 用戶,你必須以一個(gè)超級(jí)賬號(hào)登錄,并且以 postgres
用戶啟動(dòng)一個(gè) shell 并且設(shè)置正確的路徑:
RUNAS /USER:postgres "CMD.EXE"
SET PATH=%PATH%;C:\Program Files\PostgreSQL\13\bin;
并且用帶引號(hào)的目錄運(yùn)行pg_upgrade,例如:
pg_upgrade.exe
--old-datadir "C:/Program Files/PostgreSQL/9.6/data"
--new-datadir "C:/Program Files/PostgreSQL/13/data"
--old-bindir "C:/Program Files/PostgreSQL/9.6/bin"
--new-bindir "C:/Program Files/PostgreSQL/13/bin"
一旦啟動(dòng),pg_upgrade
將驗(yàn)證兩個(gè)集簇是否兼容并且 執(zhí)行升級(jí)。你可以使用pg_upgrade --check
來只執(zhí)行檢查, 這種模式即使在舊服務(wù)器還在運(yùn)行時(shí)也能使用。 pg_upgrade --check
也將列出任何在更新后需要做的手工調(diào)整。 如果你將要使用鏈接或克隆模式,你應(yīng)該使用--link
或
--clone
選項(xiàng)和--check
一起來啟用鏈接模式相關(guān)的檢查。 pg_upgrade
要求在當(dāng)前目錄中的寫權(quán)限。
顯然,沒有人可以在升級(jí)期間訪問這些集簇。pg_upgrade 默認(rèn)會(huì)在端口 50432 上運(yùn)行服務(wù)器來避免意外的客戶端連接。在做升級(jí)時(shí), 可以對(duì)兩個(gè)集簇使用相同的端口號(hào),因?yàn)樾屡f集簇不會(huì)在同時(shí)被運(yùn)行。不過, 在檢查一個(gè)舊的運(yùn)行中服務(wù)器時(shí),新舊端口號(hào)必須不同。
如果在恢復(fù)數(shù)據(jù)庫模式時(shí)發(fā)生錯(cuò)誤,pg_upgrade
將會(huì)退出 并且你必須按照下文步驟 16中所說的恢復(fù) 舊集簇。要再次嘗試pg_upgrade
,你將需要修改 舊集簇,這樣 pg_upgrade 模式會(huì)成功恢復(fù)。如果問題是一個(gè)
contrib
模塊, 你可能需要從舊集簇中卸載該模塊并且在升級(jí)后重新把它安裝在新集簇中,不過 這樣做的前提是該模塊沒有被用來存儲(chǔ)用戶數(shù)據(jù)。
升級(jí)流復(fù)制和日志傳送后備服務(wù)器
如果使用鏈接模式并且有流復(fù)制(見第 26.2.5 節(jié))或者日志 傳送(見第 26.2 節(jié))后備服務(wù)器,你可以遵照下面的 步驟對(duì)它們進(jìn)行快速的升級(jí)。你將不用在這些后備服務(wù)器上運(yùn)行 pg_upgrade,而是在主服務(wù)器上運(yùn)行rsync。 到這里還不要啟動(dòng)任何服務(wù)器。
如果你沒有使用鏈接模式、沒有或不想使用rsync或者想用一種更容易的解決方案,請(qǐng)?zhí)^這一節(jié)中的過程并且在pg_upgrade完成并且新的主集簇開始運(yùn)行后重建后備服務(wù)器。
在后備服務(wù)器上安裝新的 PostgreSQL 二進(jìn)制文件
確保新的二進(jìn)制和支持文件被安裝在所有后備服務(wù)器上。
確保不存在新的后備機(jī)數(shù)據(jù)目錄
確保新的后備機(jī)數(shù)據(jù)目錄不存在或者為空。如果 運(yùn)行過initdb,請(qǐng)刪除后備服務(wù)器的新數(shù)據(jù)目錄。
安裝自定義共享對(duì)象文件
在新的后備機(jī)上安裝和新的主集簇中相同的自定義共享對(duì)象文件。
停止后備服務(wù)器
如果后備服務(wù)器仍在運(yùn)行,現(xiàn)在使用上述的指令停止它們。
保存配置文件
從舊后備機(jī)的配置目錄保存任何需要保留的配置文件,例如 postgresql.conf
(以及它包含的任何文件)、 postgresql.auto.conf
、pg_hba.conf
, 因?yàn)檫@些文件在下一步中會(huì)被重寫或者移除。
運(yùn)行rsync
在使用鏈接模式時(shí),后備服務(wù)器可以使用rsync快速升級(jí)。為了實(shí)現(xiàn)這一點(diǎn),在主服務(wù)器上一個(gè)高于新舊數(shù)據(jù)庫集簇目錄的目錄中為每個(gè)后備服務(wù)器運(yùn)行這個(gè)命令:
rsync --archive --delete --hard-links --size-only --no-inc-recursive old_cluster new_cluster remote_dir
其中old_cluster
和new_cluster
是相對(duì)于主服務(wù)器上的當(dāng)前目錄的,而remote_dir
是后備服務(wù)器上高于新舊集簇目錄的一個(gè)目錄。在主服務(wù)器和后備服務(wù)器上指定目錄之下的目錄結(jié)構(gòu)必須匹配。指定遠(yuǎn)程目錄的詳細(xì)情況請(qǐng)參考rsync的手冊(cè),例如:
rsync --archive --delete --hard-links --size-only --no-inc-recursive /opt/PostgreSQL/9.5 \ /opt/PostgreSQL/9.6 standby.example.com:/opt/PostgreSQL
可以使用rsync的--dry-run
選項(xiàng)驗(yàn)證該命令將做的事情。雖然在主服務(wù)器上必須為至少一臺(tái)后備運(yùn)行rsync,可以在一臺(tái)已經(jīng)升級(jí)過的后備服務(wù)器上運(yùn)行rsync來升級(jí)其他的后備服務(wù)器,只要已升級(jí)的后備服務(wù)器還沒有被啟動(dòng)。
這個(gè)命令所做的事情是記錄由pg_upgrade的鏈接模式創(chuàng)建的鏈接,它們連接主服務(wù)器上新舊集簇中的文件。該命令接下來在后備服務(wù)器的舊集簇中尋找匹配的文件并且為它們?cè)谠摵髠涞男录刂袆?chuàng)建鏈接。主服務(wù)器上沒有被鏈接的文件會(huì)被從主服務(wù)器拷貝到后備服務(wù)器(通常都很?。?。這提供了快速的后備服務(wù)器升級(jí)。不幸地是,rsync會(huì)不必要地拷貝與臨時(shí)表和不做日志表相關(guān)的文件,因?yàn)橥ǔT诤髠浞?wù)器上不存在這些文件。
如果有表空間,你將需要為每個(gè)表空間目錄運(yùn)行一個(gè)類似的rsync命令,例如:
rsync --archive --delete --hard-links --size-only --no-inc-recursive /vol1/pg_tblsp/PG_9.5_201510051 \
/vol1/pg_tblsp/PG_9.6_201608131 standby.example.com:/vol1/pg_tblsp
如果你已經(jīng)把pg_wal
放在數(shù)據(jù)目錄外面,也必須在那些目錄上運(yùn)行rsync。
配置流復(fù)制和日志傳送后備服務(wù)器
為日志傳送配置服務(wù)器(不需要運(yùn)行pg_start_backup()
以及pg_stop_backup()
或者做文件系統(tǒng)備份,因?yàn)閺膶贆C(jī) 仍在與主機(jī)同步)。
恢復(fù) pg_hba.conf
如果你修改了pg_hba.conf
,則要將其恢復(fù)到原始的設(shè)置。 也可能需要調(diào)整新集簇中的其他配置文件來匹配舊集簇,例如 postgresql.conf
(以及它包含的任何文件)和 postgresql.auto.conf
。
啟動(dòng)新服務(wù)器
現(xiàn)在可以安全地啟動(dòng)新的服務(wù)器,并且可以接著啟動(dòng)任何 rsync過的后備服務(wù)器。
升級(jí)后處理
如果需要做任何升級(jí)后處理,pg_upgrade 將在完成后發(fā)出警告。它也將 生成必須由管理員運(yùn)行的腳本文件。這些腳本文件將連接到每一個(gè)需要做 升級(jí)后處理的數(shù)據(jù)庫。每一個(gè)腳本應(yīng)該這樣運(yùn)行:
psql --username=postgres --file=script.sql postgres
這些腳本可以以任何順序運(yùn)行并且在運(yùn)行之后立即刪除。
通常在重建腳本運(yùn)行完成之前訪問重建腳本中引用的表是不安全的,這樣做 可能會(huì)得到不正確的結(jié)果或者很差的性能。沒有在重建腳本中引用的表可以 隨時(shí)被訪問。
統(tǒng)計(jì)信息
由于pg_upgrade
并未傳輸優(yōu)化器統(tǒng)計(jì)信息,在升級(jí)的尾聲 你將被指示運(yùn)行一個(gè)命令來生成這些信息。你可能需要設(shè)置連接參數(shù)來匹配你 的新集簇。
刪除舊集簇
一旦你對(duì)升級(jí)表示滿意,你就可以通過運(yùn)行 pg_upgrade
完成時(shí)提到的腳本來刪除舊集簇的 數(shù)據(jù)目錄(如果在舊數(shù)據(jù)目錄中有用戶定義的表空間就不可能實(shí)現(xiàn)自動(dòng)刪除)。 你也可以刪除舊安裝目錄(例如bin
、share
)。
恢復(fù)到舊集簇
在運(yùn)行pg_upgrade
之后,如果你希望恢復(fù)到 舊集簇,有幾個(gè)選項(xiàng):
如果使用了 --check
選項(xiàng), 則舊集群沒有被修改;它可以被重新啟動(dòng)。
如果 --link
選項(xiàng) 沒有被使用, 舊集群沒有被修改;它可以被重新啟動(dòng)。
如果使用了--link
選項(xiàng), 數(shù)據(jù)文件可能在新舊群集之間共享:
如果pg_upgrade
在鏈接啟動(dòng)之前中止,舊群集沒有被修改,它可以重新啟動(dòng)。
如果你沒有啟動(dòng)新集群,舊集群沒有被修改,當(dāng)鏈接啟動(dòng)時(shí),一個(gè).old
后綴會(huì)附加到$PGDATA/global/pg_control
。 如果要重用舊集群,從$PGDATA/global/pg_control
移除.old
后綴;你就可以重啟舊集群。
如果你已經(jīng)啟動(dòng)新群集,它已經(jīng)寫入了共享文件,并且使用舊群集會(huì)不安全。這種情況下,需要從備份中還原舊群集。
pg_upgrade創(chuàng)建不同的工作文件,如模式轉(zhuǎn)儲(chǔ),在當(dāng)前工作目錄中。為了安全,請(qǐng)確保該目錄不可被任何其他用戶讀取或者寫入。
pg_upgrade在新舊數(shù)據(jù)目錄中啟動(dòng)短期的postmasters。臨時(shí) Unix 套接字文件用于與這些postmasters通信,默認(rèn)情況下,在當(dāng)前工作目錄中進(jìn)行。 在某些情況下,當(dāng)前目錄的路徑名稱可能太長(zhǎng),無法成為有效的套接字名稱。這種情況下你可以使用-s
選項(xiàng)將套接字文件放在某些具有較短路徑名稱的目錄中。 為了安全原因,請(qǐng)確保該目錄不可被任何其他用戶讀取或者寫入。(這在
Windows 上不受支持。)
如果失敗、重建和重索引會(huì)影響你的安裝,pg_upgrade 將會(huì)報(bào)告這些情況。用來重建表和索引的升級(jí)后腳本將會(huì)自動(dòng)被建立。 如果你正在嘗試自動(dòng)升級(jí)很多集簇,你應(yīng)該發(fā)現(xiàn)具有相同數(shù)據(jù)庫模式的集簇 對(duì)所有集簇升級(jí)都要求同樣的升級(jí)后步驟,這是因?yàn)樯?jí)后步驟是基于數(shù)據(jù) 庫模式而不是用戶數(shù)據(jù)。
對(duì)于部署測(cè)試,創(chuàng)建一個(gè)只有模式的舊集簇副本,在其中插入假數(shù)據(jù)并且升級(jí)。
pg_upgrade不支持包含使用這些reg*
OID-引用 系統(tǒng)數(shù)據(jù)類型的表列的數(shù)據(jù)庫的升級(jí):
regcollation
|
regconfig
|
regdictionary
|
regnamespace
|
regoper
|
regoperator
|
regproc
|
regprocedure
|
(regclass
, regrole
, and regtype
can be upgraded.)
如果你在升級(jí)一個(gè)PostgreSQL 9.2 之前的集簇,并且 它使用一個(gè)只有配置文件的目錄,你必須向pg_upgrade
傳遞真正的數(shù)據(jù)目錄位置,并且把配置目錄位置傳遞給服務(wù)器,例如 -d /real-data-directory -o '-D /configuration-directory'
。
如果正在使用的一個(gè) 9.1 之前的舊服務(wù)器用的是一個(gè)非默認(rèn)Unix 域套接字目錄 或者使用的默認(rèn)值不同于新集簇的默認(rèn)值,請(qǐng)把PGHOST
設(shè)置為 指向舊服務(wù)器的套接字位置(這與 Windows 無關(guān))。
如果你想要使用鏈接模式并且你不想讓你的舊集簇在新集簇啟動(dòng)時(shí)被修改,考慮使用克隆模式。 如果(克隆模式)不可用,可以復(fù)制一份舊集簇并且在副本上以鏈接模式進(jìn)行升級(jí)。要?jiǎng)?chuàng)建舊集簇的一 份合法拷貝,可以在服務(wù)器運(yùn)行時(shí)使用rsync
創(chuàng)建舊集簇的 一份臟拷貝,然后關(guān)閉舊服務(wù)器并且再次運(yùn)行rsync --checksum
把更改更新到該拷貝以讓其一致(--checksum
是必要的,因?yàn)? rsync
在判斷文件修改時(shí)間的更改時(shí)的精度只能到秒級(jí))。如 第 25.3.3 節(jié)中所述,你可能想要排除 一些文件,例如postmaster.pid
。如果你的文件系統(tǒng)支持文
件系統(tǒng)快照或者 copy-on-write 文件副本,你可以使用它們來創(chuàng)建舊集簇和 表空間的一個(gè)備份,不過快照和副本必須被同時(shí)創(chuàng)建或者在數(shù)據(jù)庫服務(wù)器關(guān)閉 期間被創(chuàng)建。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: