بررسی حالتهای shutdown در دیتابیس پستگرس

برای توقف و یا استارت کردن دیتابیس پستگرس از دستور 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 در اوراکل می باشد.

ارتباط با نویسنده مطلب:vahidusefzadeh@ کانال تخصصی اوراکل و لینوکس: OracleDB@

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد.