برای توقف و یا استارت کردن دیتابیس پستگرس از دستور pg_ctl استفاده می شود. فرمت کلی این دستور به صورت زیر می باشد:
pg_ctl start [-w] [-t seconds] [-s] [-D datadir] [-l filename] [-o options] [-p path] [-c]
pg_ctl stop [-W] [-t seconds] [-s] [-D datadir] [-m s[mart] | f[ast] | i[mmediate] ]
همانطور که در شکل کلی دستور pg_ctl قابل مشاهده است، استارت کردن دیتابیس پستگرس پییچدگی خاصی ندارد و صرفا می توان با اجرای دستور زیر، دیتابیس را استارت نمود:
[postgres@ol7 ~]$ pg_ctl -D /postgres/mydb start
waiting for server to start….2019-09-04 01:55:24.914 EDT [22529] LOG: listening on IPv6 address “::1”, port 5432
2019-09-04 01:55:24.914 EDT [22529] LOG: listening on IPv4 address “127.0.0.1”, port 5432
2019-09-04 01:55:24.917 EDT [22529] LOG: listening on Unix socket “/tmp/.s.PGSQL.5432”
2019-09-04 01:55:24.932 EDT [22530] LOG: database system was shut down at 2019-09-04 01:55:21
2019-09-04 01:55:24.936 EDT [22529] LOG: database system is ready to accept connections
done
server started
اما برای متوقف کردن دیتابیس پستگرس، سه انتخاب وجود دارد:
smart|fast|immediate
قصد داریم در این متن، به تفاوت هر کدام از این گزینه ها بپردازیم.
Smart shutdown
در صورت اجرای دستور pg_ctl stop همراه با گزینه smart، شرایط زیر ایجاد می شود:
1.امکان اتصال کاربر جدید به دیتابیس از بین خواهد رفت.
–session 1:
[postgres@ol7 ~]$ psql -U usef -d postgres
psql.bin (10.8)
Type “help” for help.
postgres=#
–session 2:
[postgres@ol7 ~]$ pg_ctl -D /postgres/mydb stop -m smart
waiting for server to shut down…………………………
–session 3:
[postgres@ol7 ~]$ psql -U usef -d postgres
psql.bin: FATAL: the database system is shutting down
2.کاربرانی که به دیتابیس متصل هستند، می توانند به کارشان ادامه دهند. بر این اساس، در مثال بالا، session شماره یک می تواند به کارش ادامه دهد:
–session 1:
postgres=# select count(*) from pg_tables;
count
——-
69
(1 row)
3.تا زمان خروج کامل کاربران، دیتابیس down نخواهد شد همچنین در صورت گذشت 60 ثانیه از صدور دستور shutdown توسط session شماره دو، دستور pg_ctl stop با پیام زیر مواجه خواهد شد:
[postgres@ol7 ~]$ pg_ctl -D /postgres/mydb stop -m smart
waiting for server to shut down……………………………………………………… failed
pg_ctl: server does not shut down
HINT: The “-m fast” option immediately disconnects sessions rather than
waiting for session-initiated disconnection.
4.نهایتا با خروج همه کاربران، دیتابیس متوقف خواهد شد:
–session 1:
postgres=# \q
[postgres@ol7 ~]$ pg_ctl -D /postgres/mydb status
pg_ctl: no server running
پ.ن: pg_ctl stop –m smart مشابه دستور shutdown normal در دیتابیس اوراکل است.
Fast shutdown
توقف دیتابیس به صورت fast سبب می شود تا:
1.امکان ورود کاربران جدید از بین برود.
2.تراکنشهای در حال اجرا rollback شوند.
3.تمامی کاربران متصل به دیتابیس به بیرون رانده شوند.
4.نهایتا با اجرای cehckpoint، دیتابیس متوقف خواهد شد.
fast گزینه پیش فرض دستور pg_ctl برای توقف دیتابیس می باشد(از پستگرس نسخه 9.5) و در صورت توقف دیتابیس به این روش، نیازی به انجام عملیات ریکاوری در زمان استارت دیتابیس نخواهد بود.
—session 1:
[postgres@ol7 ~]$ psql -U usef -d postgres
psql.bin (10.8)
Type “help” for help.
postgres=# begin;
BEGIN
postgres=# delete from mytbl5;
DELETE 71
–session 2:
[postgres@ol7 ~]$ pg_ctl -D /postgres/mydb stop -m fast
waiting for server to shut down….2019-09-07 07:42:31.362 EDT [3100] LOG: received fast shutdown request
2019-09-07 07:42:31.363 EDT [3100] LOG: aborting any active transactions
2019-09-07 07:42:31.364 EDT [3113] FATAL: terminating connection due to administrator command
2019-09-07 07:42:31.365 EDT [3100] LOG: worker process: logical replication launcher (PID 3107) exited with exit code 1
2019-09-07 07:42:31.366 EDT [3102] LOG: shutting down
2019-09-07 07:42:31.380 EDT [3100] LOG: database system is shut down
done
server stopped
–session 1:
postgres=# \l
FATAL: terminating connection due to administrator command
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
The connection to the server was lost. Attempting reset: Failed.
پ.ن: pg_ctl stop –m fastمشابه دستور shutdown immediate در دیتابیس اوراکل می باشد.
Immediate shutdown
استفاده از گزینه immediate سبب توقف بی وقفه دیتابیس خواهد شد و تفاوتی با قطع برق سرور ندارد.
در این صورت، در زمان استارت دیتابیس باید عملیات ریکاوری با کمک WAL logها انجام شود:
–session 1:
postgres=# begin;
BEGIN
postgres=# insert into mytbl values(1,’usefzadeh’);
INSERT 0 1
–session 2:
[postgres@ol7 ~]$ pg_ctl -D /postgres/mydb stop -m immediate;
waiting for server to shut down…. done
server stopped
–session 1:
postgres=# select * from mytbl;
WARNING: terminating connection because of crash of another server process
DETAIL: The postmaster has commanded this server process to roll back the current transaction and exit, because another server process exited abnormally and possibly corrupted shared memory.
HINT: In a moment you should be able to reconnect to the database and repeat your command.
server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
The connection to the server was lost. Attempting reset: Failed.
با استارت مجدد دیتابیس خواهیم دید که عملیات session شماره یک، rollback شده است:
[postgres@ol7 ~]$ pg_ctl -D /postgres/mydb start
waiting for server to start….2019-09-04 04:38:07.423 EDT [1390] LOG: listening on IPv6 address “::1”, port 5432
2019-09-04 04:38:07.423 EDT [1390] LOG: listening on IPv4 address “127.0.0.1”, port 5432
2019-09-04 04:38:07.425 EDT [1390] LOG: listening on Unix socket “/tmp/.s.PGSQL.5432”
2019-09-04 04:38:07.441 EDT [1391] LOG: database system was interrupted; last known up at 2019-09-04 03:58:09 EDT
2019-09-04 04:38:07.455 EDT [1391] LOG: database system was not properly shut down; automatic recovery in progress
2019-09-04 04:38:07.456 EDT [1391] LOG: redo starts at 0/16B88D8
2019-09-04 04:38:07.456 EDT [1391] LOG: invalid record length at 0/16B89B8: wanted 24, got 0
2019-09-04 04:38:07.456 EDT [1391] LOG: redo done at 0/16B8980
2019-09-04 04:38:07.464 EDT [1390] LOG: database system is ready to accept connections
done
server started
[postgres@ol7 ~]$ psql -U usef -d postgres
psql.bin (10.8)
postgres=# select * from mytbl;
id | name
—-+——
(0 rows)
پ.ن: دستور pg_ctl stop –m immediate معادل دستور shutdown abort در اوراکل می باشد.