آموزش نصب PostgreSQL روی سرور CentOS 7

ما در این مطلب به آموزش نحوه نصب PostgreSQL روی CentOS 7 و استفاده از آن می‌پردازیم. با ما همراه باشید…


مقدمه

سیستم‌های مدیریت پایگاه‌داده رابطه‌ای، در بسیاری از وب‌سایت‌ها و اپلیکیشن‌ها مولفه‌ای کلیدی و بسیار مهم هستند. این سیستم‌ها، روشی ساختاریافته برای ذخیره، سازماندهی و دستیابی به اطلاعات ارائه می‌دهند.

PostgreSQL یا Postgres یک سیستم مدیریت پایگاه‌داده رابطه‌ای است که بر مبنای زبان پرس‌وجوی SQL پیاده‌سازی شده است. از جمله مزیت‌های Postgres می‌توان به سازگاری با استانداردها (standards-compliant) اشاره کرد. همچنین، این سیستم مدیریت پایگاه‌داده از ویژگی‌های پیشرفته زیادی برخوردار است که از جمله آنها می‌توان به دو ویژگی “تراکنش‌های قابل اعتماد (reliable transactions)” و “همزمانی بدون قفل‌های خواندن (concurrency without read locks)” اشاره کرد.

در ادامه به نصب PostgreSQL روی سرور CentOS 7 خواهیم پرداخت و با چند روش ابتدائی از آن استفاده می‌کنیم.


پیش‌نیازها

برای اینکه با این آموزش همراه شوید، به یک سرور CentOS 7 نیاز دارید که با توجه به موارد مذکور در دو لینک زیر پیکربندی شده باشند:

1) https://www.digitalocean.com/community/tutorials/initial-server-setup-with-centos-7

2) https://www.digitalocean.com/community/tutorials/additional-recommended-steps-for-new-centos-7-servers

بعلاوه، شما نیاز به یک یوزر non-root در سرور خودتان دارید که دارای امتیازات sudo نیز باشد.

همچنین، باید از نصب بودن firewalld روی سرور اطمینان حاصل کنید. برای اطلاعات بیشتر به این لینک مراجعه کنید.

دیتابیس‌ها می‌توانند نسبت به تغییرات زمان سیستم آسیب‌پذیر باشند. بخصوص زمانی که رکوردهای داخلی دیتابیس دارای timestamp باشند. برای جلوگیری از ناسازگاری‌های بوجود آمده بدلیل ناهمگامی‌های زمانی، به این لینک مراجعه کرده و دستورالعمل‌های موجود در بخش “Configure Timezones and Network Time Protocol Synchronization” را اجرا نموده و از کانفیگ صحیح NTP اطمینان حاصل نمایید.


گام اول – نصب PostgreSQL

شما می‌توانید با استفاده از ریپازیتوری‌های پیش‌فرض موجود در CentOS اقدام به نصب PostgreSQL نمایید. اما بدلیل اینکه در زمان نگارش این مقاله نسخه Postgres موجود در ریپازیتوری پیش‌فرض CentOS 7 منسوخ شده است، برای تهیه این آموزش از ریپازیتوری رسمی Postgres استفاده می‌کنیم.

قبل از اینکه اقدام به اضافه کردن ریپازیتوری جدید کنیم، باید ریپازیتوری پایه CentOS را از جستجو بدنبال پکیج‌های postgresql منع کنیم. در غیر اینصورت، ممکن است که وابستگی‌ها (dependencies) به postgresql موجود در ریپازیتوری پایه CentOS ربط داده شوند.

فایل پیکربندی ریپازیتوری را با ویرایشگر متنی دلخواهتان باز کنید. در این آموزش از vim استفاده شده است:

sudo vi /etc/yum.repos.d/CentOS-Base.repo

قسمت [base] و [updates] را درون فایل پیدا کرده و در هر دو قسمت خطِ *exclude=postgresql را اضافه کنید. در نتیجه، فایل پیکربندی شما مشابه زیر خواهد بود:

...
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

exclude=postgresql*

#released updates
[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
exclude=postgresql*
...

در پایان، فایل را ذخیره کرده و ببندید.

 

سپس، با استفاده از ریپازیتوری رسمی PostgreSQL، یک پکیج پیکربندی ریپازیتوری نصب نمایید:

sudo yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm

با فشردن دکمه y، ادامه نصب را تایید نمایید.

 

ریپازیتوری PostgreSQL شامل اطلاعاتی در زمینه همه نسخه‌های در دسترس PostgreSQL است.

yum list postgresql*

نسخه مد نظرتان را انتخاب و نصب PostgreSQL را آغاز نمایید. نسخه مورد استفاده در این آموزش PostgreSQL 11 می‌باشد.

برای نصب سرور PostgreSQL از فرمان زیر استفاده نمایید:

sudo yum install postgresql11-server

در خلال فرایند نصب از شما درباره وارد کردن یک کلید GPG سوال می‌گردد:

...
Importing GPG key 0x442DF0F8:
 Userid     : "PostgreSQL RPM Building Project <[email protected]>"
 Fingerprint: 68c9 e2b9 1a37 d136 fe74 d176 1f16 d2e1 442d f0f8
 Package    : pgdg-redhat-repo-42.0-5.noarch (installed)
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-PGDG
Is this ok [y/N]:

با فشردن کلید y، ایمپورت شدن این کلید را تایید کنید تا فرآیند نصب PostgreSQL کامل گردد.

حالا که نصب PostgreSQL به پایان رسید، نوبت به طی مراحل مقدماتی لازم به منظور مهیا کردن یک کلاستر پایگاه‌داده جدید برای PostgreSQL می‌رسد.


گام دوم – ایجاد یک کلاستر پایگاه‌داده PostgreSQL جدید:

قبل از اینکه بتوانید از پایگاه‌داده Postgres استفاده کنید، باید یک کلاستر پایگاه‌داده PostgreSQL جدید ایجاد نمایید.

یک کلاستر پایگاه‌داده در واقع مجموعه‌ای از پایگاه‌داده‌ها است که توسط یک سرور واحد مدیریت می‌گردند.

فرایند ایجاد نمودن یک کلاستر پایگاه‌داده شامل موارد زیر است:

1) ایجاد نمودن دایرکتوری‌هایی به منظور قرارگیری داده‌های پایگاه‌داده در آن‌ها

2) تولید جداول کاتالوگ اشتراکی (shared catalog tables)

3) ایجاد پایگاه‌داده‌های template1 و postgres

پایگاه داده template1 برای ایجاد یک پایگاه‌داده جدید مورد نیاز است. پس از ایجاد پایگاه‌داده جدید، هر چیزی که در template1 ذخیره شده باشد در پایگاه‌داده جدید قرار داده خواهد شد. پایگاه‌داده postgres یک پایگاه‌داده پیش‌فرض است که به منظور استفاده کاربران، utility ها و برنامه‌های شخص ثالث طراحی شده است.

با استفاده از دستور initdb یک کلاستر پایگاه‌داده PostgreSQL ایجاد کنید:

 
sudo /usr/pgsql-11/bin/postgresql-11-setup initdb

با اجرای فرمان فوق، خروجی زیر را مشاهده خواهید کرد:

// Output
Initializing database ... OK

PostgreSQL را با استفاده از دستور systemctl شروع و فعال نمایید:

sudo systemctl start postgresql-11
sudo systemctl enable postgresql-11

با اجرای دستورات فوق، خروجی زیر حاصل می‌گردد:

// Output
Created symlink from /etc/systemd/system/multi-user.target.wants/postgresql-11.service to /usr/lib/systemd/system/postgresql-11.service.

حالا که PostgreSQL بالا آمده و در حال اجرا است، با هم سراغ استفاده از Role ها و یادگیری نحوه عملکرد Postgres می‌رویم. همچنین، تفاوت بین Postgres و سایر سیستم‌های مدیریت پایگاه‌داده مشابه را درک می‌نماییم.


گام سوم – استفاده از Role ها و پایگاه‌داده‌های PostgreSQL:

بصورت پیش‌فرض، Postgres از مفهومی به نام roles (نقش‌ها) برای مدیریت مجوزها و احراز هویت استفاده می‌نماید.

این نقش‌ یا role ها از جهاتی مشابه اکانت‌های قاعده‌مند یونیکس هستند، با این تفاوت که Postgres بین کاربران و گروه‌ها تمایزی قائل نمی‌شود و در عوض role های انعطاف‌پذیرتر را ترجیح می‌دهد.

پس از نصب، Postgres به گونه‌ای تنظیم شده است که از احراز هویت شناسه (ident authentication) استفاده می‌کند. به این معنی که نقش‌ها با یک اکانت سیستم یونیکس/لینوکس مرتبط می‌گردد. اگر نقشی در Postgres موجود باشد، یک کاربر یونیکس/لینوکس که نام کاربری آن یکسان با نام آن نقش باشد، می‌تواند با همان نقش به سیستم ورود کند.

در خلال فرایند نصبِ PostgreSQL، یک حساب کاربری با نام postgres ایجاد شده است که مرتبط با نقش پیش‌فرض Postgres است. شما می‌توانید برای استفاده از نقش Postgres به اکانت postgres لاگین کنید.

چند روش برای دسترسی به نقش Postgres بواسطه اکانت postgres وجود دارد.

به اکانت postgres سوئیچ کنید:

با اجرای فرمان زیر در سرورتان به اکانت postgres سوئیچ کنید:

sudo -i -u postgres

اکنون می‌توانید با اجرای دستور زیر به خط فرمان Postgres دسترسی پیدا کنید:

psql

اکنون شما به خط فرمان PostgreSQL وارد شده‌اید و از این پس می‌توانید بصورت مستقیم با سیستم مدیریت پایگاه داده تعامل کنید.

برای خروج از خط فرمان PostgreSQL دستور q\ را در خط فرمان تایپ کرده و اجرا کنید. با اجرای این دستور به خط فرمان لینوکس در اکانت postgres منتقل می‌گردید.
با اجرای دستور زیر از اکانت postgres خارج شده و به خط فرمان اکانت اصلی خود منتقل خواهید شد:

 
exit
دستیابی به اکانت Postgres بدون نیاز به تغییر اکانت:

بدین منظور بجای اینکه ابتدا به اکانت postgres لاگین نمایید و سپس به خط فرمان Postgres بروید، می‌توانید اینکار را در یک دستور به شکل زیر انجام دهید:

 
sudo -u postgres psql

بدین ترتیب، با اجرای دستور فوق شما مستقیما به Postgres وارد می‌گردید.
شما می‌توانید با تایپ و اجرای دستور q\ از این سِشِن تعاملی Postgres خارج شوید.


گام چهارم – ایجاد یک نقش جدید:

در حال حاضر، شما فقط role یا نقشِ postgres را در پایگاه‌داده کانفیگ کرده‌اید.

شما می‌توانید با استفاده از فرمان createrole بواسطه خط فرمان نقش‌های جدیدی ایجاد کنید.

اگر در اکانت postgres هستید، می‌توانید با تایپ کردن دستور زیر یک کاربر جدید بسازید:

 
createuser --interactive

در غیر اینصورت، اگر می‌خواهید بدون سوئیچ کردن به اکانت postgres همین کار را انجام دهید از فرمان sudo استفاده نمایید:

 
sudo -u postgres createuser --interactive

پس از اجرای هر کدام از دو دستور فوق، بدلیل استفاده از پرچم “interactive–” در انتهای دستور، از شما در مورد دو چیز سوال می‌گردد: اولی در مورد نام کاربر جدید و دومی در مورد اعطای مجوزهای superuser به کاربر جدید.

در این آموزش ما یک کاربر جدید با نام sammy ایجاد می‌کنیم و امتیازات superuser را به آن اعطا می‌نماییم، خروجی:

 
// Output
Enter name of role to add: sammy
Shall the new role be a superuser? (y/n) y

با پاس دادن پرچم‌های اضافی دیگر می‌توانید کنترل بیشتری روی ایجاد کاربر جدید داشته باشید. برای بررسی گزینه‌های اضافی دستور زیر را اجرا کنید:

 
man createuser

گام پنجم – ایجاد یک پایگاه‌داده جدید:

در سیستم احراز هویت Postgres بصورت پیش‌فرض هر نقش یا رُلی که برای لاگین کردن مورد استفاده قرار می‌گیرد، اینگونه در نظر گرفته می‌شود که دارای پایگاه‌داده‌ای هم نام با خودش است و به آن پایگاه‌داده دسترسی هم دارد. این بدان معنی است که کاربری که در انتهای گام قبلی با نام sammy ایجاد کردیم، بصورت پیش‌فرض برای اتصال به پایگاه‌داده‌ای با همین نام تلاش خواهد کرد. شما می‌توانید با استفاده از دستور createdb پایگاه‌داده مناسب را ایجاد نمایید.

اگر شما با اکانت postgres لاگین هستید، دستور زیر را اجرا نمایید:

 
createdb sammy

در غیر اینصورت، اگر می‌خواهید بدون سوئیچ کردن به اکانت postgres همین کار را انجام دهید از فرمان sudo استفاده نمایید:

 
sudo -u postgres createdb sammy

این انعطاف‌پذیری در صورت لزوم می‌تواند چندین مسیر مختلف برای ایجاد یک پایگاه‌داده جدید فراهم کند.

حالا که یک پایگاه‌داده جدید ایجاد کردید، نوبت به این می‌رسد که با role جدید در آن لاگین نمایید.


گام ششم – باز کردن خط فرمان Postgres با رُل جدید:

برای لاگین نمودن با احراز هویت مبتنی بر شناسه (ident based authentication)، شما نیاز به یک کاربر لینوکس با نام کاربری یکسان با نام رُل و پایگاه‎داده Postgres دارید.

اگر شما کاربری با این مشخصات در سرور خودتان ندارید، می‌توانید با استفاده از دستور adduser ایجادش کنید.

برای ایجاد این کاربر شما باید از یک اکانت non-root با امتیازات sudo استفاده نمایید(بدین معنی که، نباید در اکانت postgres لاگین باشید):

 
sudo adduser sammy

با ساخته شدن اکانت جدید، شما می‌توانید به این اکانت سوئیچ کرده در عین حال به پایگاه‌داده نیز متصل شوید:

 
sudo -i -u sammy
psql

عمل فوق را می‌توان در یک خط بصورت زیر انجام داد:

 
sudo -u sammy psql

دستور فوق شما را بصورت خودکار لاگین می‌کند.
اگر می‌خواهید که یوزرتان به پایگاه‌داده دیگری متصل شود، با مشخص کردن پایگاه‌داده اینکار را انجام دهید:

 
psql -d postgres

به محض لاگین شدن، می‌توانید اطلاعات اتصال فعلی خودتان را با تایپ دستور زیر بدست آورید:

 
\conninfo

خروجی حاصله از اجرای دستور فوق:

 
// Output
You are connected to database "sammy" as user "sammy" via socket in "/var/run/postgresql" at port "5432".

این مورد زمانی مفید است که شما در حال اتصال به پایگاه‌داده‌ها یا کاربران غیر پیش‌فرض هستید.

اکنون که به پایگاه داده متصل شدید، می‌توانید جداول را ایجاد و حذف نمایید.


گام هفتم – ایجاد و حذف جداول:

حالا که شما می‌دانید چطور به PostgreSQL متصل شوید، نوبت به یادگیری برخی از وظایف اصلی Postgres می‌رسد.

ابتدا، یک جدول برای ذخیره داده‌ها ایجاد کنید. به عنوان مثال، جدولی برای ذخیره‌سازی داده‌های مرتبط با تجهیزات یک زمین بازی ایجاد نمایید.

سینتکس اصلی این دستور به شرح زیر است:

 
CREATE TABLE table_name (
    column_name1 col_type (field_length) column_constraints,
    column_name2 col_type (field_length),
    column_name3 col_type (field_length)
);

فرامین فوق به جدول یک نام می‌دهند، همچنین ستون‌ها و نوع داده آن‌ها در این فرامین مشخص می‌گردد. بعلاوه، حداکثر طول فیلد‌های داده‌ای نیز تعیین می‌گردد. اضافه کردن constraints برای هر ستون از جدول اختیاری می‌باشد. برای کسب اطلاعات بیشتر به این لینک مراجعه نمایید.

به عنوان مثال، جدول ساده‌ای مشابه آنچه که در زیر آمده است ایجاد نمایید:

 
CREATE TABLE playground (
    equip_id serial PRIMARY KEY,
    type varchar (50) NOT NULL,
    color varchar (25) NOT NULL,
    location varchar(25) check (location in ('north', 'south', 'west', 'east', 'northeast', 'southeast', 'southwest', 'northwest')),
    install_date date
);
عملکرد دستورات فوق چیست؟

اجرای دستورات فوق منجر به ایجاد جدولی می‌گردد که برای فهرست نمودن تجهیزات زمین بازی مناسب است. ستون equip_id از نوع serial است. این نوع در واقع یک عدد صحیح است که به صورت خودکار افزایش می‌یابد.علاوه بر این، این ستون دارای محدودیت دیگری نیز هست که با ذکر کلید واژه PRIMARY KEY مشخص شده است. فیلدی که با استفاده از این کلید واژه تعریف شده باشد علاوه بر اینکه نمی‌تواند null باشد، باید به ازای هر رکورد موجود در جدول یک مقدار یکتا نیز داشته باشد.

اندازه دو فیلد equip_id و install_date بصورت صریح مشخص نشده است. زیرا، برخی از انواع نیازی به مشخص کردن اندازه فیلد بصورت صریح ندارند و در واقع اندازه فیلد بصورت ضمنی و از روی نوع آن فیلد مشخص خواهد شد.

فیلد type از نوع varchar با اندازه 50 تعریف شده است و برای ذخیره نوع وسیله بکار می‌رود.

فیلد color از نوع varchar با اندازه 25 تعریف شده است و برای ذخیره رنگ وسیله بکار می‌رود.

فیلد location از نوع varchar با اندازه 25 تعریف شده و می‌تواند یکی از هشت مقدار مشخص شده زیر را داشته باشد:

'north', 'south', 'west', 'east', 'northeast', 'southeast', 'southwest', 'northwest'

فیلد install_date از نوع date تعریف شده و برای ذخیره تاریخ نصب وسیله در زمین بازی بکار می‌رود.

شما می‌توانید جدول جدیدتان را با تایپ و اجرای فرمان d\ در خط فرمان، ببینید:

خروجی:

 
//  Output
                  List of relations
 Schema |          Name           |   Type   | Owner 
--------+-------------------------+----------+-------
 public | playground              | table    | sammy
 public | playground_equip_id_seq | sequence | sammy
(2 rows)

با دقت در خروجی فوق خواهید دید که علاوه بر جدول playground مورد دیگری با نام playground_equip_id_seq و از نوع sequence وجود دارد. این مورد در واقع نمایشی از نوع serial است که به فیلد equip_id داده‌اید و بصورت خودکار برای فیلدهایی از این نوع ایجاد می‌گردد. در واقع playground_equip_id_seq نگه‌دارنده عدد بعدی توالی می‌باشد.

اگر می‌خواهید فقط جدول را بدون sequence ببینید، از دستور زیر استفاده کنید:

 
\dt

خروجی:

 
//  Output
          List of relations
 Schema |    Name    | Type  | Owner 
--------+------------+-------+-------
 public | playground | table | sammy
(1 row)

 


گام هشتم – افزودن ، پرس و جو و حذف داده ها در یک جدول:

حالا که یک جدول دارید، می‌توانید داده‌ها را وارد آن نمایید.

به عنوان مثال، برای اضافه کردن سُرسُره و تاب بصورت زیر اقدام کنید:

 
INSERT INTO playground (type, color, location, install_date) VALUES ('slide', 'blue', 'south', '2017-04-28');
INSERT INTO playground (type, color, location, install_date) VALUES ('swing', 'yellow', 'northwest', '2018-08-16');

یکسری اشتباهات متداول در وارد نمودن داده به جداول پایگاه داده وجود دارد، به عنوان مثال:
– نام ستون‌های جدول نباید داخل علامت نقل قول قرار بگیرند اما مقادیری که قرار است به فیلدهای (ستون‌های) جدول نسبت داده شوند باید درون علامت نقل قول ( ‘ ‘ ) قرار داده شوند.
– شما نباید برای فیلد equip_id مقداری مشخص کنید. این فیلد با اضافه شدن رکورد جدید بصورت خودکار مقدار دهی می‌گردد.

برای بازیابی اطلاعات موجود در جدول از دستور زیر استفاده نمایید:

 
SELECT * FROM playground;

خروجی:

 
//  Output
 equip_id | type  | color  | location  | install_date 
----------+-------+--------+-----------+--------------
        1 | slide | blue   | south     | 2017-04-28
        2 | swing | yellow | northwest | 2018-08-16
(2 rows)

برای حذف یک رکورد (ردیف) از جدول، باید بصورت زیر اقدام کرد:

 
DELETE FROM playground WHERE type = 'slide';

پس از اجرای دستور فوق ردیف‌هایی از جدول که مقدار فیلد type در آن‌ها برابر با slide باشد از جدول حذف خواهند شد.

حصول مجدد اطلاعات جدول:

 
SELECT * FROM playground;

خروجی:

 
//  Output
 equip_id | type  | color  | location  | install_date 
----------+-------+--------+-----------+--------------
        2 | swing | yellow | northwest | 2018-08-16
(1 row)

مشاهده می‌کنید که ردیف مربوط به slide (سُرسُره) از جدول حذف شده است.
اکنون که توانستیم اعمال حذف و اضافه رکوردها را اجرا کنیم، می‌رویم سراغ حذف یک ستون یا فیلد از جدول.


گام نهم – حذف و اضافه یک ستون(فیلد) جدول:

اکنون می‌خواهیم ستون last_maint را برای نمایش آخرین تاریخ بازدید از وسایل زمین بازی به جدول اضافه کنیم:

 
ALTER TABLE playground ADD last_maint date;

اگر دوباره به جدول playground نگاهی بیاندازید، متوجه خواهید شد که ستون جدیدی با نام last_maint به این جدول اضافه شده است، اما هیچ مقداری در این ستون وجود ندارد:

 
SELECT * FROM playground;

خروجی:

 
//  Output
 equip_id | type  | color  | location  | install_date | last_maint 
----------+-------+--------+-----------+--------------+------------
        2 | swing | yellow | northwest | 2018-08-16   | 
(1 row)

حذف یک ستون(فیلد) از جدول نیز به همین راحتی است:

 
ALTER TABLE playground DROP last_maint;

با اجرای کوئری فوق ستون last_maint و تمام مقادیر موجود در آن از جدول حذف خواهد شد.


گام دهم – بروز رسانی داده‌های درون جدول:

تا اینجا یاد گرفتید چطور یک رکورد به جدول اضافه و از آن حذف نمایید. حالا نوبت به اصلاح داده‌های موجود می‌رسد.

کوئری زیر را تایپ و اجرا نمایید:

 
UPDATE playground SET color = 'red' WHERE type = 'swing';

کوئری فوق، تمامی رکورد‌های موجود در جدول playground که مقدار فیلد type آن‌ها برابر با swing باشد را یافته و مقدار فیلد color را در این رکوردها به red تغییر می‌دهد.

برای تصدیق عملکرد این دستور، از اطلاعات موجود در جدول خروجی بگیرید:

 
SELECT * FROM playground;
 
//  Output
 equip_id | type  | color | location  | install_date 
----------+-------+-------+-----------+--------------
        2 | swing | red   | northwest | 2010-08-16
(1 row)

همانطور که مشاهده می‌کنید مقدار فیلد color که پیش از این برابر با yellow بود به red تغییر یافته است.


جمع بندی

شما در این مطلب با نحوه نصب PostgreSQL روی سرور CentOS 7 آشنا شدید. اما، هنوز Postgres چیز‌های زیادی برای یادگیری دارد. امیدواریم که در آینده همراه ما باشید تا با هم در دنیای Postgres بیشتر سرک بکشیم…