AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁(yè) > 科技  > 軟件

再大的 DDL 變更操作都不怕了!一條命令直接搞定

來源: 責(zé)編: 時(shí)間:2024-07-10 17:56:00 116觀看
導(dǎo)讀介紹pg-online-schema-change (pg-osc) 是一個(gè)工具,用于以最小的鎖在 PostgreSQL 表中進(jìn)行模式更改(任何ALTER語(yǔ)句),以幫助實(shí)現(xiàn)在生產(chǎn)環(huán)境工作負(fù)載下進(jìn)行零停機(jī)的模式更改。pg-osc使用了影子表的概念來執(zhí)行模式更改。在較

介紹

pg-online-schema-change (pg-osc) 是一個(gè)工具,用于以最小的鎖在 PostgreSQL 表中進(jìn)行模式更改(任何ALTER語(yǔ)句),以幫助實(shí)現(xiàn)在生產(chǎn)環(huán)境工作負(fù)載下進(jìn)行零停機(jī)的模式更改。BVO28資訊網(wǎng)——每日最新資訊28at.com

pg-osc使用了影子表的概念來執(zhí)行模式更改。在較高級(jí)別上,它會(huì)創(chuàng)建一個(gè)在結(jié)構(gòu)上與主表相同的影子表,對(duì)影子表執(zhí)行模式更改,將內(nèi)容從主表復(fù)制到影子表,并在最后交換表名稱,同時(shí)使用觸發(fā)器(通過審計(jì)表)保留對(duì)主表的所有更改。BVO28資訊網(wǎng)——每日最新資訊28at.com

pg-osc受到了pt-online-schema-change (MySQL) 和pg_repack等工具的設(shè)計(jì)和工作原理的啟發(fā)。可在下面閱讀更多內(nèi)容,關(guān)于它是如何工作的、亮點(diǎn)特性、注意事項(xiàng)和示例。BVO28資訊網(wǎng)——每日最新資訊28at.com

用法

pg-online-schema-change help performUsage:  pg-online-schema-change perform -a,--alter-statement=ALTER_STATEMENT -d,--dbname=DBNAME -h,--host=HOST -p,--port=N -s,--schema=SCHEMA -u,--username=USERNAMEOptions:-a,--alter-statement=ALTER_STATEMENT # The ALTER statement to perform the schema change-s,--schema=SCHEMA                   # The schema in which the table is. Default: public-d,--dbname=DBNAME                   # Name of the database-h,--host=HOST                       # Server host where the Database is located-u,--username=USERNAME               # Username for the Database-p,--port=N                          # Port for the Database. Default: 5432-w,[--password=PASSWORD] # DEPRECATED: Password for the Database. Please pass PGPASSWORD environment variable instead.-v,[--verbose],[--no-verbose] # Emit logs in debug mode-f,[--drop],[--no-drop] # Drop the original table in the end after the swap-k,[--kill-backends],[--no-kill-backends] # Kill other competing queries/backends when trying to acquire lock for the shadow table creation and swap. It will wait for --wait-time-for-lock duration before killing backends and try upto 3 times.-w,[--wait-time-for-lock=N] # Time to wait before killing backends to acquire lock and/or retrying upto 3 times. Default: 10. It will kill backends if --kill-backends is true, otherwise try upto 3 times and exit if it cannot acquire a lock.-c,[--copy-statement=COPY_STATEMENT] # Takes a .sql file location where you can provide a custom query to be played (ex: backfills) when pgosc copies data from the primary to the shadow table. More examples in README.-b,[--pull-batch-count=N] # Number of rows to be replayed on each iteration after copy. Default: 1000. This can be tuned for faster catch up and swap. Best used with delta-count.-e,[--delta-count=N] # Indicates how many rows should be remaining before a swap should be performed. Default: 20. This can be tuned for faster catch up and swap, especially on highly volume tables. Best used with pull-batch-count.-o,[--skip-foreign-key-validation],[--no-skip-foreign-key-validation] # Skip foreign key validation after swap. You shouldn't need this unless you have a very specific use case, like manually validating foreign key constraints after swap.
Usage:  pg-online-schema-change --version, -vprint the version

亮點(diǎn)特性

  • ? pg-osc支持在添加、刪除或重命名列時(shí)運(yùn)行,而不會(huì)丟失數(shù)據(jù)。
  • ? pg-osc在整個(gè)過程中只獲取最少的鎖(閱讀下面的警告)。
  • ? 復(fù)制索引和外鍵。
  • ? 可以在最后刪除或保留舊表(可選)。
  • ? 減少膨脹(因?yàn)?pg-osc 會(huì)創(chuàng)建一個(gè)新表,并在交換后刪除舊表)。
  • ? 調(diào)整審計(jì)/日志表中重放速度的快慢(重放更大的工作負(fù)載)。
  • ? 在將數(shù)據(jù)從主表復(fù)制到影子表時(shí),回填舊列/新列,然后執(zhí)行交換。示例。

示例

重命名列

export PGPASSWORD=""pg-online-schema-change perform /  --alter-statement 'ALTER TABLE books RENAME COLUMN email TO new_email' /  --dbname "postgres" /  --host "localhost" /  --username "jamesbond"

多個(gè) ALTER 語(yǔ)句

export PGPASSWORD=""pg-online-schema-change perform /  --alter-statement 'ALTER TABLE books ADD COLUMN "purchased" BOOLEAN DEFAULT FALSE; ALTER TABLE books RENAME COLUMN email TO new_email;' /  --dbname "postgres" /  --host "localhost" /  --username "jamesbond" /  --drop

5 秒后殺死其他后端

如果操作是在一個(gè)繁忙的表上執(zhí)行的,則可以使用pg-osc的kill-backend功能,來終止可能與pg-osc操作競(jìng)爭(zhēng)的其他后端,以便在短時(shí)間內(nèi)獲取鎖。pg-osc獲得的ACCESS EXCLUSIVE鎖只持有一小段時(shí)間,然后就釋放了。您可以調(diào)整在殺死其他后端之前pg-osc應(yīng)該等待多長(zhǎng)時(shí)間(或者pg-osc是否應(yīng)該在一開始就殺死后端)。BVO28資訊網(wǎng)——每日最新資訊28at.com

export PGPASSWORD=""pg-online-schema-change perform /--alter-statement 'ALTER TABLE books ADD COLUMN "purchased" BOOLEAN DEFAULT FALSE;' /--dbname "postgres" /--host "localhost" /--username "jamesbond" /--wait-time-for-lock5 /--kill-backends /--drop

重放更大的工作負(fù)載

如果表的寫入吞吐量較高,則默認(rèn)的重放速度可能不夠用。也就是說,您可能會(huì)看到pg-osc從審計(jì)表中一次性重放 1000 行(pull-batch-count)。pg-osc還會(huì)等到審計(jì)表中的剩余行數(shù)(delta-count)為 20 后再進(jìn)行交換。您可以將這些值調(diào)整為更高的值,以便更快地趕上此類工作負(fù)載。BVO28資訊網(wǎng)——每日最新資訊28at.com

export PGPASSWORD=""pg-online-schema-change perform /--alter-statement 'ALTER TABLE books ADD COLUMN "purchased" BOOLEAN DEFAULT FALSE;' /--dbname "postgres" /--host "localhost" /--username "jamesbond" /--pull-batch-count 2000--delta-count 500--wait-time-for-lock5 /--kill-backends /--drop

回填數(shù)據(jù)

在將數(shù)據(jù)插入到影子表時(shí),您可以傳入自定義 sql 文件,來執(zhí)行復(fù)制和任何其他工作,而不僅僅是從主表復(fù)制所有列和行。例如:回填某些列。通過提供copy-statement,pg-osc將改為運(yùn)行查詢以執(zhí)行復(fù)制操作。BVO28資訊網(wǎng)——每日最新資訊28at.com

重要提示:BVO28資訊網(wǎng)——每日最新資訊28at.com

? 可能會(huì)意外違反約束或不復(fù)制數(shù)據(jù),因此請(qǐng)謹(jǐn)慎操作。BVO28資訊網(wǎng)——每日最新資訊28at.com

? 在自定義 SQL 中連接時(shí),必須使用 OUTER JOIN,否則會(huì)丟失與連接表不匹配的行。BVO28資訊網(wǎng)——每日最新資訊28at.com

? ALTER語(yǔ)句可能會(huì)更改表的結(jié)構(gòu),因此請(qǐng)謹(jǐn)慎操作。BVO28資訊網(wǎng)——每日最新資訊28at.com

? 保留%{shadow_table},因?yàn)樗鼤?huì)替換為影子表的目標(biāo)。BVO28資訊網(wǎng)——每日最新資訊28at.com

? 強(qiáng)烈建議用戶在生產(chǎn)環(huán)境上使用之前,先測(cè)試和驗(yàn)證結(jié)果!BVO28資訊網(wǎng)——每日最新資訊28at.com

-- file: /src/query.sqlINSERT INTO %{shadow_table}(foo, bar, baz, rental_id, tenant_id)SELECT a.foo,a.bar,a.baz,a.rental_id,r.tenant_id AS tenant_idFROM ONLY examples aLEFT OUTER JOIN rentals rON a.rental_id = r.id
pg-online-schema-change perform /  --alter-statement 'ALTER TABLE books ADD COLUMN "tenant_id" VARCHAR;' /  --dbname "postgres" /  --host "localhost" /  --username "jamesbond" /  --copy-statement "/src/query.sql" /  --drop

使用 Docker 運(yùn)行

docker run --network host -it --rm shayonj/pg-osc:latest /    pg-online-schema-change perform /    --alter-statement 'ALTER TABLE books ADD COLUMN "purchased" BOOLEAN DEFAULT FALSE; ALTER TABLE books RENAME COLUMN email TO new_email;' /    --dbname "postgres" /    --host "localhost" /    --username "jamesbond" /    --drop

注意事項(xiàng)

? 目前尚不支持分區(qū)表。歡迎提供 PR 請(qǐng)求和想法。BVO28資訊網(wǎng)——每日最新資訊28at.com

? 表上應(yīng)存在主鍵;沒有的話,pg-osc會(huì)引發(fā)異常BVO28資訊網(wǎng)——每日最新資訊28at.com

? 這是因?yàn)椋壳皼]有其他方法可以在重放期間唯一標(biāo)識(shí)行。BVO28資訊網(wǎng)——每日最新資訊28at.com

? pg-osc會(huì)在操作期間兩次獲取父表上的ACCESS EXCLUSIVE鎖。BVO28資訊網(wǎng)——每日最新資訊28at.com

? 第一次,在設(shè)置觸發(fā)器和影子表時(shí)。BVO28資訊網(wǎng)——每日最新資訊28at.com

? 下一次,在執(zhí)行交換和更新外鍵引用時(shí)。BVO28資訊網(wǎng)——每日最新資訊28at.com

? 注意:如果指定了kill-backends,它會(huì)嘗試終止在這兩個(gè)時(shí)間內(nèi)的任何競(jìng)爭(zhēng)操作。BVO28資訊網(wǎng)——每日最新資訊28at.com

? 根據(jù)設(shè)計(jì),pg-osc不會(huì)終止正在執(zhí)行的任何其他 DDL。在操作過程中,最好不要對(duì)父表運(yùn)行任何 DDL。BVO28資訊網(wǎng)——每日最新資訊28at.com

? 由于復(fù)制表的性質(zhì),磁盤上需要有足夠的空間來支持該操作。BVO28資訊網(wǎng)——每日最新資訊28at.com

? 索引、約束和序列名稱會(huì)被更改,并失去其原始命名。BVO28資訊網(wǎng)——每日最新資訊28at.com

? 可以在將來的版本中修復(fù)。如有需要,可創(chuàng)建特性請(qǐng)求。BVO28資訊網(wǎng)——每日最新資訊28at.com

? 外鍵會(huì)被刪除,并重新以NOT VALID的方式添加到引用表。接著運(yùn)行VALIDATE CONSTRAINT操作。BVO28資訊網(wǎng)——每日最新資訊28at.com

? 要確保保持完整性,并在重新引入外鍵時(shí)不用獲取額外的鎖,因此才會(huì)使用NOT VALID。BVO28資訊網(wǎng)——每日最新資訊28at.com

它是如何工作的

此工具中有 3 種類型的表:BVO28資訊網(wǎng)——每日最新資訊28at.com

  • ? 主表:可能要對(duì)其運(yùn)行模式更改的表
  • ? 影子表:現(xiàn)有主表的副本表
  • ? 審計(jì)表:用于存儲(chǔ)主表上的任何更新/插入/刪除的表

how-it-workshow-it-worksBVO28資訊網(wǎng)——每日最新資訊28at.com

1. 創(chuàng)建一個(gè)審計(jì)表,以記錄對(duì)父表所做的更改。BVO28資訊網(wǎng)——每日最新資訊28at.com

2. 獲取一個(gè)簡(jiǎn)短的ACCESS EXCLUSIVE鎖,以在父表上添加觸發(fā)器,記錄插入、更新、刪除操作到審計(jì)表。BVO28資訊網(wǎng)——每日最新資訊28at.com

3. 創(chuàng)建一個(gè)新的影子表,并在影子表上運(yùn)行 ALTER 或遷移。BVO28資訊網(wǎng)——每日最新資訊28at.com

4. 復(fù)制舊表中的所有行。BVO28資訊網(wǎng)——每日最新資訊28at.com

5. 在新表上構(gòu)建索引。BVO28資訊網(wǎng)——每日最新資訊28at.com

6. 將審計(jì)表中累積的所有更改重放到影子表中。BVO28資訊網(wǎng)——每日最新資訊28at.com

? 在審計(jì)審計(jì)表中的行時(shí),刪除這些行。BVO28資訊網(wǎng)——每日最新資訊28at.com

7. 一旦差量行數(shù)(剩余行數(shù))到 ~20,則在事務(wù)中獲取父表上的ACCESS EXCLUSIVE鎖,然后:BVO28資訊網(wǎng)——每日最新資訊28at.com

? 交換表名稱(影子表 <> 父表)。BVO28資訊網(wǎng)——每日最新資訊28at.com

? 刪除外鍵,并重新以NOT VALID的方式創(chuàng)建,以更新其他表中的外鍵引用。BVO28資訊網(wǎng)——每日最新資訊28at.com

8. 在新表上運(yùn)行ANALYZE。BVO28資訊網(wǎng)——每日最新資訊28at.com

9. 驗(yàn)證所有添加的NOT VALID的外鍵。BVO28資訊網(wǎng)——每日最新資訊28at.com

10. 刪除父表(現(xiàn)在是舊表)(可選)。BVO28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-100185-0.html再大的 DDL 變更操作都不怕了!一條命令直接搞定

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 騰訊電商部門二面:如何保證冪等性?

下一篇: DDD 是什么?—— 你以前只會(huì)用 Service + 貧血模型!

標(biāo)簽:
  • 熱門焦點(diǎn)
Top