Postgresql主從異步流復(fù)制方案的深入探究
前言
數(shù)據(jù)庫的備份工作在日常生產(chǎn)中極為重要,如果你咨詢一個(gè)DBA如何才能設(shè)計(jì)出高可用的數(shù)據(jù)備份與恢復(fù)方案,相信很多人都會(huì)從架構(gòu)上給出很多容災(zāi)的意見。但歸根到底,如果業(yè)務(wù)環(huán)節(jié)中數(shù)據(jù)庫還牽涉到分布式環(huán)境,我認(rèn)為一個(gè)好的方案需要達(dá)到三大要求:
- 多副本
- 持久化
- 一致性
日常架構(gòu)設(shè)計(jì)中,我們不僅要保證數(shù)據(jù)額的成功備份,還要保證備份的數(shù)據(jù)可以快速恢復(fù)。在眾多備份恢復(fù)可靠性方案中 主從復(fù)制 技術(shù),可以說是最常見的實(shí)現(xiàn),本文主要是介紹postgresql主備數(shù)據(jù)庫的異步流復(fù)制的環(huán)境搭建與主備切換的操作實(shí)踐,除了能把一些基礎(chǔ)的原理運(yùn)用在日常的數(shù)據(jù)庫運(yùn)維中,也可以加深對(duì)Postgresql數(shù)據(jù)庫的底層知識(shí)了解。
postgres在9.0之后引入了主從的流復(fù)制機(jī)制,所謂流復(fù)制,就是從服務(wù)器通過tcp流從主服務(wù)器中同步相應(yīng)的數(shù)據(jù)。這樣當(dāng)主服務(wù)器數(shù)據(jù)丟失時(shí)從服務(wù)器中仍有備份。
與基于文件日志傳送相比,流復(fù)制允許保持從服務(wù)器更新。 從服務(wù)器連接主服務(wù)器,其產(chǎn)生的流WAL記錄到從服務(wù)器, 而不需要等待主服務(wù)器寫完WAL文件。
PostgreSQL流復(fù)制默認(rèn)是異步的。在主服務(wù)器上提交事務(wù)和從服務(wù)器上變化可見之間有一個(gè)小的延遲,這個(gè)延遲遠(yuǎn)小于基于文件日志傳送,通常1秒能完成。如果主服務(wù)器突然崩潰,可能會(huì)有少量數(shù)據(jù)丟失。
同步復(fù)制必須等主服務(wù)器和從服務(wù)器都寫完WAL后才能提交事務(wù)。這樣在一定程度上會(huì)增加事務(wù)的響應(yīng)時(shí)間。
下面的學(xué)習(xí)與實(shí)踐主要針對(duì)PostgreSQL的異步流復(fù)制(本文沒有涉及到同步復(fù)制、邏輯復(fù)制等,如果大家想了解其它的備份方案,可以閱讀相關(guān)官方文檔或其他資料介紹)。
異步流復(fù)制的中心思想是:主庫上提交事務(wù)時(shí)不需要等待備庫接收WAL日志流并寫入到備庫WAL日志文件時(shí)便返回成功,因此異步流復(fù)制的TPS會(huì)相對(duì)同步流復(fù)制要高,延遲更低。
環(huán)境準(zhǔn)備
操作系統(tǒng) | 服務(wù)器IP | 節(jié)點(diǎn)名稱 | 角色 |
---|---|---|---|
centos 7.2 | 172.17.0.2 | pghost1 | 主庫 |
centos 7.2 | 172.17.0.5 | pghost2 | 備庫 |
主要目錄規(guī)范:
- 數(shù)據(jù)目錄: /data/pg10/pg_root
- 表空間目錄: /data/pg10/pg_tbs
- 應(yīng)用程序目錄: /apps/svr/pgsql
要注意的是:編譯安裝Pg我們使用的是root賬戶,但是一般情況下,我們對(duì)數(shù)據(jù)庫的部署操作等應(yīng)該使用非root的pg超級(jí)管理員賬戶,所以需要我們預(yù)先創(chuàng)建相關(guān)用戶和目錄,并設(shè)置相關(guān)權(quán)限:
$ groupadd postgres $ useradd postgres -g postgres $ passwd postgres $ mkdir -p /data/pg10/pg_root $ mkdir -p /data/pg10/tbs $ chown -R postgres:postgres /data/pg10
實(shí)驗(yàn)用的postgresql為10.0版本
pghost1 和 pghost2 分別下載該版本的源碼安裝包
wget https://ftp.postgresql.org/pub/source/v10.0/postgresql-10.0.tar.gz
下載后進(jìn)行解壓
tar -zxvf postgresql-10.0.tar.gz
安裝前依賴
由于 configure過程中依賴操作系統(tǒng)包zlib、readline等,所以我實(shí)用yum預(yù)先安裝:
yum groupinstall "Development tools” yum install -y bison flex readline readline-devel zlib zlib-devel
主備庫數(shù)據(jù)庫安裝
安裝前,我們先分別對(duì)pghost1 和 pghost2創(chuàng)建postgresql的偏好環(huán)境變量
vi /etc/profile.d/pgsql.sh
追加以下內(nèi)容:
export PGPORT=1921 export PGUSER=postgres export PGDATA=/data/pg10/pg_root export LANG=en_US.utf8 export PGHOME=/apps/svr/pgsql export LD_LIBRARY_PATH=$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib export PATH=$PGHOME/bin:$PATH:. export MANPATH=$PGHOME/share/man:$MANPATH alias rm='rm -i' alias ll='ls -lh'
保存文件,并讓環(huán)境變量生效:
source /etc/profile.d/pgsql.sh
再進(jìn)入剛剛解壓的 postgresql-10.0 目錄中,執(zhí)行以下命令:
./configure —prefix=/apps/svr/pgsql_10.0/ --with-pgport=1921
之后進(jìn)行編譯安裝:
gmake gmake install
安裝完成后,我們可以使用以下命令確認(rèn)是否安裝成功:
$ postgres --version postgres (PostgreSQL) 10.0
復(fù)制功能部署
在啟動(dòng)數(shù)據(jù)庫服務(wù)搭建主從結(jié)構(gòu)前,有幾個(gè)比較重要的配置文件需要我們額外地進(jìn)行創(chuàng)建與設(shè)置的,它們分別是:
- postgreql.conf
- pg_hba.conf
- recovery.conf
- .pgpass
下面我們會(huì)在實(shí)踐中,具體地對(duì)上述的文件的配置進(jìn)行相關(guān)說明
上一節(jié),我們編譯安裝好了postgresql,我們接下來切換操作用戶
su postgresql
然后使用initdb工具初始化數(shù)據(jù)庫:
echo "123456" >> /data/pg10/pgpass initdb -D /data/pg10/pg_root -E UTF8 --locale=C -U postgres --pwfile=/data/pg10/pgpass
執(zhí)行上述命令后,在/data/pg10/pg_root目錄下會(huì)產(chǎn)生系統(tǒng)數(shù)據(jù)文件,
PG_VERSION pg_dynshmem pg_multixact pg_snapshots pg_tblspc postgresql.auto.conf base pg_hba.conf pg_notify pg_stat pg_twophase postgresql.conf global pg_ident.conf pg_replslot pg_stat_tmp pg_wal pg_commit_ts pg_logical pg_serial pg_subtrans pg_xact
之后我們開始配置 /data/pg10/pg_root/postgresql.conf,修改以下幾個(gè)關(guān)鍵項(xiàng):
listen_addresses = '*' wal_level = replica archive_mode = on archive_command = '/bin/date' max_wal_senders = 10 wal_keep_segments = 512 hot_standby = on
注:主庫和備庫的 /data/pg10/pg_root/postgresql.conf 配置建議完全一致
接下來我們?cè)?備庫 上配置 /data/pg10/pg_root/pg_hba.conf
host replication repuser 172.17.0.2/32 md5 host replication repuser 172.17.0.5/32 md5
其實(shí)最好主庫也配置一份,因?yàn)橹鲙旌蛡鋷斓慕巧皇庆o止的,在手動(dòng)或庫出現(xiàn)故障情況下,它們的角色會(huì)互相更換。
之后,我們先啟動(dòng)主庫 pghost1了 (記得切換到postgres用戶):
$ pg_ctl start -D $PGDATA ... ... database system is ready to accept connections done server started
使用PostgreSQL的超級(jí)管理員postgres登錄到創(chuàng)建流復(fù)制用戶repuser,流復(fù)制用戶需要有 REPLICATION權(quán)限和LOGIN權(quán)限
$ psql -U postgres -p 1921 psql (10.0) Type "help" for help. postgres=# CREATE USER repuser REPLICATION LOGIN CONNECTION LIMIT 5 ENCRYPTED PASSWORD 'domac123'; CREATE ROLE
以上命令基本完成主庫上的配置,接下來我們需要熱備生成一個(gè)備庫,制作備庫過程中主庫仍然可以讀寫,不影響業(yè)務(wù),我們?cè)谥鲙焐蟿?chuàng)建備份任務(wù):
postgres=# select pg_start_backup('domacli_bak'); pg_start_backup ----------------- 0/2000060 (1 row)
pg_start_backup() 函數(shù)會(huì)在主庫上發(fā)起一個(gè)在線備份,命令執(zhí)行后,將數(shù)據(jù)文件壓縮拷貝到備份節(jié)點(diǎn)上:
$ tar czvf pg_root.tar.gz pg_root --exclude=pg_root/pg_wal $ scp pg_root.tar.gz postgres@172.17.0.5:/data/pg10
pg_wal目錄不是必須復(fù)制的,可以排除這個(gè)目錄,以節(jié)省空間,然后我們回到備庫的/data/pg10下,執(zhí)行主庫備份文件的解壓:
$ tar xvf pg_root.tar.gz
解壓后,我們回到主節(jié)點(diǎn),執(zhí)行停止備份命令,結(jié)束這次備份流程
postgres=# select pg_stop_backup(); NOTICE: pg_stop_backup complete, all required WAL segments have been archived pg_stop_backup ---------------- 0/2000168 (1 row)
以上的命令表示完成在線備份,但備庫上扔需要做一些配置,我們回到備庫上,配置 /data/pg10/pg_root/recovery.conf文件,如果該文件不存在,可以執(zhí)行以下命令,在軟件目錄中復(fù)制一個(gè):
cp $PGHOME/share/recovery.conf.sample /data/pg10/pg_root/recovery.conf
備庫的 recovery.conf 配置以下參數(shù)
recovery_target_timeline = 'latest' standby_mode = on primary_conninfo = 'host=172.17.0.2 port=1921 user=repuser'
主要觀察recovery.conf中的參數(shù)primary_conninfo 中的 user=repuser, 還記得我們前面在主庫上創(chuàng)建的流傳輸用戶repuser嗎?由于主備直接數(shù)據(jù)同步需要在用戶下執(zhí)行操作,而主庫上我們創(chuàng)建repuser的時(shí)候,為了安全我設(shè)置了密碼, 但recovery.conf我們沒有配置明文密碼,那么程序的密碼如何獲得呢?
我們建議把密碼設(shè)置在 ~/.pgpass中:
你也可以直接在上面的recovery.conf 設(shè)置 primary_conninfo = ‘host=172.17.0.2 port=1921 user=repuser password=domac123', 但這樣會(huì)有安全風(fēng)險(xiǎn)
$ cd ~ $ touch .pgpass $ chmod 0600 .pgpass
填寫以下內(nèi)容:
172.17.0.2:1921:replication:repuser:domac123 172.17.0.5:1921:replication:repuser:domac123
好了,當(dāng)這些備注都就緒之后,我們可以開始啟動(dòng)我們的備庫了:
$ pg_ctl start ... database system is ready to accept read only connections done server started
如果備庫正常啟動(dòng),我們可以在主備兩庫上觀察WAL發(fā)生與接收進(jìn)程是否都同時(shí)工作,以確認(rèn)異步流工作是否正常工作
主庫上:
ps -ef | grep wal postgres 6939 6935 0 23:16 ? 00:00:00 postgres: wal writer process postgres 6983 6935 0 23:42 ? 00:00:00 postgres: wal sender process repuser 172.17.0.5(45910) streaming 0/3000140
備庫上:
ps -ef | grep wal postgres 26481 26479 0 23:42 ? 00:00:00 postgres: wal receiver process streaming 0/3000140 postgres 26486 26448 0 23:42 ? 00:00:00 grep --color=auto wal
使用 pg_basebackup 方式部署流復(fù)制
接下來,介紹一種操作相對(duì)簡(jiǎn)潔的方式,上述我們配置操作所牽涉到的主要步驟有:
- pg_start_backup
- 兩臺(tái)服務(wù)器之間的數(shù)據(jù)拷貝
- pg_stop_backup
以上三個(gè)步驟可以合成一步完成,PostgreSQL提供內(nèi)置的pg_basebackup命令行工具支持對(duì)主庫發(fā)起一個(gè)在線基準(zhǔn)備份,并自動(dòng)進(jìn)入備份模式進(jìn)行數(shù)據(jù)庫基準(zhǔn)備份,備份完成后自動(dòng)從備份模式退出,不需要執(zhí)行額外的pg_start_backup 和pg_stop_backup 命令顯式地聲明進(jìn)入備份模式和退出備份模式,pg_basebackup工具是對(duì)數(shù)據(jù)庫實(shí)例級(jí)進(jìn)行的物理備份,因此這個(gè)工具通常作為備份工具對(duì)據(jù)庫進(jìn)行基準(zhǔn)備份
pg_basebackup工具發(fā)起備份需要超級(jí)用戶權(quán)限或REPLICATION權(quán)限,注意max_wal_senders參數(shù)配置,因?yàn)閜g_basebackup工具將消耗至少一個(gè)WAL發(fā)送進(jìn)程。本節(jié)將演示通過pg_basebackup工具部署異步流復(fù)制,之前已經(jīng)在pghost2上部署了一個(gè)備庫,我們先將這個(gè)備庫刪除,之后通過pg_basebackup工具重新做一次備庫,刪除pghost2上的備庫只需要先停備庫之后刪除備庫數(shù)據(jù)庫數(shù)據(jù)文件即可,如下所示:
進(jìn)入pghost2服務(wù)器上(172.17.0.5)
$ pg_ctl stop -m fast waiting for server to shut down.... done server stopped $ rm -rf $PGDATA $ rm -rf /data/pg10/pg_tbs
接下來,在pghost2上,使用pg_basebackup觸發(fā)基準(zhǔn)備份
pg_basebackup -D $PGDATA -Fp -Xs -v -P -h 172.17.0.2 -p 1921 -U repuser -W
執(zhí)行后,會(huì)看到相關(guān)的日志輸出
pg_basebackup: initiating base backup, waiting for checkpoint to complete pg_basebackup: checkpoint completed pg_basebackup: write-ahead log start point: 0/20007A8 on timeline 1 pg_basebackup: starting background WAL receiver 22655/22655 kB (100%), 1/1 tablespace pg_basebackup: write-ahead log end point: 0/2000888 pg_basebackup: waiting for background process to finish streaming ... pg_basebackup: base backup completed
從以上日志信息看出pg_basebackup命令首先對(duì)數(shù)據(jù)庫做一次checkpoint,之后基于時(shí)間點(diǎn)做一個(gè)全庫基準(zhǔn)備份,全備過程中會(huì)拷貝$PGDATA數(shù)據(jù)文件和表空間文件到備庫節(jié)點(diǎn)對(duì)應(yīng)目錄
最后,跟之前使用pg_start_backup的方式一樣,備庫記得配置recovery.conf
recovery_target_timeline = 'latest' standby_mode = on primary_conninfo = 'host=172.17.0.2 port=1921 user=repuser password=domac123'
如果也配置了pgpass文件,可以使用下屬的配置:
recovery_target_timeline = 'latest' standby_mode = on primary_conninfo = 'host=172.17.0.2 port=1921 user=repuser'
到此為止,主備的配置基本完成,當(dāng)然,穩(wěn)妥起見,我們最好多動(dòng)手動(dòng)手,嘗試在主庫上創(chuàng)建并插入數(shù)據(jù),觀察備庫上是否同步這些操作,我們?cè)僦鲙焐蟿?chuàng)建一張表:
postgres=# create table test_ms(id int4); CREATE TABLE postgres=# insert into test_ms values(6); INSERT 0 1
主庫上,我們創(chuàng)建test_ms表,并插入了一條數(shù)據(jù),我們就可以在備庫上進(jìn)行查詢觀察是否同步成功:
postgres=# select * from test_ms; id ---- 6 (1 row)
接下來,我們?cè)僦鲙焐希俨僮?/p>
postgres=# insert into test_ms values(9); INSERT 0 1 postgres=# delete from test_ms where id=6; DELETE 1
這個(gè)時(shí)候,我們發(fā)現(xiàn)備庫的數(shù)據(jù)也都正常同步上了:
postgres=# select * from test_ms; id ---- 9 (1 row)
那么我們?nèi)绻趥浞萆线M(jìn)行數(shù)據(jù)操作,情況會(huì)怎樣呢?我們?cè)賯浞萆蠄?zhí)行:
postgres=# insert into test_ms values(6); ERROR: cannot execute INSERT in a read-only transaction STATEMENT: insert into test_ms values(6); ERROR: cannot execute INSERT in a read-only transaction
觀察這些錯(cuò)誤日志,我們可以了解到,異步流主從結(jié)構(gòu)中,作為從節(jié)點(diǎn)的備庫目前處于的是只讀狀態(tài),它不能進(jìn)行任何寫入操作。
主備切換
前面介紹了流復(fù)制的部署,但要注意的是主庫和備庫的角色不是靜態(tài)存在的,在維護(hù)過程中可以對(duì)兩者的進(jìn)行角色的切換,舉個(gè)例子,當(dāng)主庫掛掉的時(shí)候,需要迅速進(jìn)行主備切換,讓備庫升級(jí)為主庫,原主庫降級(jí)到備庫,主備切換是PostgreSQL高可用的基礎(chǔ),下面就介紹相關(guān)的操作。
postgresql 9.0版本流復(fù)制只能通過創(chuàng)建文件方式進(jìn)行主備切換,9.1后,開始支持使用pg_ctl promote觸發(fā)方式,相比文件觸發(fā)方式操作更方便
操作前,我們先介紹一個(gè)系統(tǒng)函數(shù)查用來判斷主備角色的方法:
postgres=# select pg_is_in_recovery(); pg_is_in_recovery ------------------- f (1 row)
如果返回 f 說明是主庫,返回 t 說明是備庫
pg_ctl promote 切換方式
我們使用以下的步驟進(jìn)行主備切換:
1、關(guān)閉主庫,建議使用 -m fast 模式關(guān)閉
$ pg_ctl stop -m fast
2、在備庫上執(zhí)行pg_ctl promote命令激活備庫,如果recovery.conf變成recovery.done表示備庫已切換成主庫
pg_ctl promote -D $PGDATA waiting for server to promote....2018-09-30 00:10:30.222 UTC [26480] LOG: received promote request LOG: redo done at 0/4000028 LOG: last completed transaction was at log time 2018-09-29 23:50:52.502513+00 LOG: selected new timeline ID: 2 LOG: archive recovery complete LOG: database system is ready to accept connections Sun Sep 30 00:10:30 UTC 2018 Sun Sep 30 00:10:30 UTC 2018 done server promoted
命令執(zhí)行后,如果原來的 recovery.conf 更名為 recovery.done, 表示切換成功
3、這時(shí)如果需要將老的主庫切換成備庫,在老的主庫的$PGDATA目錄下也創(chuàng)建recovery.conf文件(創(chuàng)建方式跟之前介紹的一樣,內(nèi)容可以和原從庫pghost2的一樣,只是primary_conninfo的IP換成對(duì)端pghost2的IP)
例如,主庫上的 recovery.conf 設(shè)置為:
recovery_target_timeline = 'latest' standby_mode = on primary_conninfo = 'host=172.17.0.5 port=1921 user=repuser password=domac123'
如果要求更高的安全性,可以參考如下配置:
recovery_target_timeline = 'latest' standby_mode = on primary_conninfo = 'host=172.17.0.5 port=1921 user=repuser'
與此同時(shí),和原備庫pghost2一樣,我們建議把repuser的密碼設(shè)置在pghost1 ~/.pgpass中:
$ cd ~ $ touch .pgpass $ chmod 0600 .pgpass
填寫以下內(nèi)容:
172.17.0.2:1921:replication:repuser:domac123 172.17.0.5:1921:replication:repuser:domac123
4、啟動(dòng)老的主庫pghost1,這時(shí)觀察主、備進(jìn)行是否正常,嚴(yán)格點(diǎn)可以在新的主庫上對(duì)剛才的test_ms表進(jìn)行操作,觀察數(shù)據(jù)是否同步成功。
pg_ctl start
我們?cè)谛轮鲙欤╬ghost2)上執(zhí)行:
postgres=# select pg_is_in_recovery(); pg_is_in_recovery ------------------- f (1 row)
發(fā)現(xiàn)它目前的角色已經(jīng)是主庫了, 在新備庫(pghost1)上繼續(xù)執(zhí)行:
postgres=# select pg_is_in_recovery(); pg_is_in_recovery ------------------- t (1 row)
發(fā)現(xiàn)它目前的角色也已經(jīng)切換為備庫了
我們?cè)賞ghost2上,執(zhí)行數(shù)據(jù)插入操作:
postgres=# insert into test_ms values(11); INSERT 0 1
這時(shí),pghost1上也觀察到數(shù)據(jù)同步成功:
postgres=# select * from test_ms; id ---- 9 11 (2 rows)
到這里為止,主從切換的演練基本完成了
總結(jié)
異步流復(fù)制模式中,主庫提交的事務(wù)不會(huì)等待備庫接收WAL日志流并返回確認(rèn)信息,因此異步流復(fù)制模式下主庫與備庫的數(shù)據(jù)版本上會(huì)存在一定的處理延遲,延遲的時(shí)間主要受主庫壓力、備庫主機(jī)性能、網(wǎng)絡(luò)帶寬等影響,當(dāng)正常情況下,主備的延遲通常在毫秒級(jí)的范圍內(nèi),當(dāng)主庫宕機(jī),這個(gè)延遲就主要受到故障發(fā)現(xiàn)與切換時(shí)間的影響而拉長(zhǎng),不過雖然如此,這些數(shù)據(jù)延遲的問題,可以從架構(gòu)或相關(guān)自動(dòng)化運(yùn)維手段不斷優(yōu)化設(shè)置。
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
在docker上部署postgreSQL主從的超詳細(xì)步驟
使用Docker能夠更加高效地部署和管理應(yīng)用程序,提高開發(fā)和運(yùn)維的效率,下面這篇文章主要給大家介紹了關(guān)于在docker上部署postgreSQL主從的超詳細(xì)步驟,文中通過代碼及圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-08-08postgresql 如何查看pg_wal目錄下xlog文件總大小
這篇文章主要介紹了postgresql 如何查看pg_wal目錄下xlog文件總大小的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01pgsql之create user與create role的區(qū)別介紹
這篇文章主要介紹了pgsql之create user與create role的區(qū)別介紹,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-01-01PostgreSQL數(shù)據(jù)庫事務(wù)出現(xiàn)未知狀態(tài)的處理方法
這篇文章主要給大家介紹了PostgreSQL數(shù)據(jù)庫事務(wù)出現(xiàn)未知狀態(tài)的處理方法,需要的朋友可以參考下2017-07-07PostgreSQL數(shù)據(jù)庫遷移部署實(shí)戰(zhàn)教程
這篇文章主要介紹了PostgreSQL數(shù)據(jù)庫遷移部署實(shí)戰(zhàn)教程,由于項(xiàng)目本身就是基于PostgreSQL數(shù)據(jù)庫構(gòu)建的,因此數(shù)據(jù)庫遷移將變得十分便捷,接下來,我將簡(jiǎn)要介紹我們的遷移步驟,需要的朋友可以參考下2023-07-07PostgreSQL樹形結(jié)構(gòu)的遞歸查詢示例
這篇文章主要給大家介紹了關(guān)于PostgreSQL樹形結(jié)構(gòu)的遞歸查詢的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用PostgreSQL具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05postgresql 實(shí)現(xiàn)更新序列的起始值
這篇文章主要介紹了postgresql 實(shí)現(xiàn)更新序列的起始值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-12-12PostgreSQL設(shè)置時(shí)間自動(dòng)更新的示例代碼
在我們?nèi)粘i_發(fā)中,在設(shè)計(jì)數(shù)據(jù)庫字段的時(shí)候不可避免的都要created_time以及updated_time兩個(gè)時(shí)間戳字段,作用大家也都一目了然,下面將為大家詳細(xì)介紹PostgreSQL設(shè)置時(shí)間自動(dòng)更新的方法,需要的朋友可以參考下2025-03-03