ما در این مطلب به آموزش نحوه نصب 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
بعلاوه، شما نیاز به یک یوزر 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...name=CentOS-$releasever - Basemirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/gpgcheck=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7exclude=postgresql*#released updatesname=CentOS-$releasever - Updatesmirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/gpgcheck=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7exclude=postgresql*...sudo yum install https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpmyum list postgresql*sudo yum install postgresql11-server...Importing GPG key 0x442DF0F8: Userid : "PostgreSQL RPM Building Project <pgsqlrpms-hackers@pgfoundry.org>" 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-PGDGIs this ok [y/N]:گام دوم - ایجاد یک کلاستر پایگاهداده 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// OutputInitializing database ... OKsudo systemctl start postgresql-11sudo systemctl enable postgresql-11// OutputCreated symlink from /etc/systemd/system/multi-user.target.wants/postgresql-11.service to /usr/lib/systemd/system/postgresql-11.service.گام سوم - استفاده از Role ها و پایگاهدادههای PostgreSQL:
بصورت پیشفرض، Postgres از مفهومی به نام roles (نقشها) برای مدیریت مجوزها و احراز هویت استفاده مینماید. این نقش یا role ها از جهاتی مشابه اکانتهای قاعدهمند یونیکس هستند، با این تفاوت که Postgres بین کاربران و گروهها تمایزی قائل نمیشود و در عوض role های انعطافپذیرتر را ترجیح میدهد. پس از نصب، Postgres به گونهای تنظیم شده است که از احراز هویت شناسه (ident authentication) استفاده میکند. به این معنی که نقشها با یک اکانت سیستم یونیکس/لینوکس مرتبط میگردد. اگر نقشی در Postgres موجود باشد، یک کاربر یونیکس/لینوکس که نام کاربری آن یکسان با نام آن نقش باشد، میتواند با همان نقش به سیستم ورود کند. در خلال فرایند نصبِ PostgreSQL، یک حساب کاربری با نام postgres ایجاد شده است که مرتبط با نقش پیشفرض Postgres است. شما میتوانید برای استفاده از نقش Postgres به اکانت postgres لاگین کنید. چند روش برای دسترسی به نقش Postgres بواسطه اکانت postgres وجود دارد.به اکانت postgres سوئیچ کنید:
با اجرای فرمان زیر در سرورتان به اکانت postgres سوئیچ کنید:sudo -i -u postgrespsqlexitدستیابی به اکانت Postgres بدون نیاز به تغییر اکانت:
بدین منظور بجای اینکه ابتدا به اکانت postgres لاگین نمایید و سپس به خط فرمان Postgres بروید، میتوانید اینکار را در یک دستور به شکل زیر انجام دهید:sudo -u postgres psqlگام چهارم - ایجاد یک نقش جدید:
در حال حاضر، شما فقط role یا نقشِ postgres را در پایگاهداده کانفیگ کردهاید. شما میتوانید با استفاده از فرمان createrole بواسطه خط فرمان نقشهای جدیدی ایجاد کنید. اگر در اکانت postgres هستید، میتوانید با تایپ کردن دستور زیر یک کاربر جدید بسازید:createuser --interactivesudo -u postgres createuser --interactive// OutputEnter name of role to add: sammyShall the new role be a superuser? (y/n) yman createuserگام پنجم - ایجاد یک پایگاهداده جدید:
در سیستم احراز هویت Postgres بصورت پیشفرض هر نقش یا رُلی که برای لاگین کردن مورد استفاده قرار میگیرد، اینگونه در نظر گرفته میشود که دارای پایگاهدادهای هم نام با خودش است و به آن پایگاهداده دسترسی هم دارد. این بدان معنی است که کاربری که در انتهای گام قبلی با نام sammy ایجاد کردیم، بصورت پیشفرض برای اتصال به پایگاهدادهای با همین نام تلاش خواهد کرد. شما میتوانید با استفاده از دستور createdb پایگاهداده مناسب را ایجاد نمایید.
اگر شما با اکانت postgres لاگین هستید، دستور زیر را اجرا نمایید:createdb sammysudo -u postgres createdb sammyگام ششم - باز کردن خط فرمان Postgres با رُل جدید:
برای لاگین نمودن با احراز هویت مبتنی بر شناسه (ident based authentication)، شما نیاز به یک کاربر لینوکس با نام کاربری یکسان با نام رُل و پایگاهداده Postgres دارید. اگر شما کاربری با این مشخصات در سرور خودتان ندارید، میتوانید با استفاده از دستور adduser ایجادش کنید. برای ایجاد این کاربر شما باید از یک اکانت non-root با امتیازات sudo استفاده نمایید(بدین معنی که، نباید در اکانت postgres لاگین باشید):sudo adduser sammysudo -i -u sammypsqlsudo -u sammy psqlpsql -d postgres\conninfo// OutputYou 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)\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');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';SELECT * FROM playground;// Output equip_id | type | color | location | install_date ----------+-------+--------+-----------+-------------- 2 | swing | yellow | northwest | 2018-08-16(1 row)گام نهم - حذف و اضافه یک ستون(فیلد) جدول:
اکنون میخواهیم ستون last_maint را برای نمایش آخرین تاریخ بازدید از وسایل زمین بازی به جدول اضافه کنیم:ALTER TABLE playground ADD last_maint date;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;گام دهم - بروز رسانی دادههای درون جدول:
تا اینجا یاد گرفتید چطور یک رکورد به جدول اضافه و از آن حذف نمایید. حالا نوبت به اصلاح دادههای موجود میرسد.
کوئری زیر را تایپ و اجرا نمایید:UPDATE playground SET color = 'red' WHERE type = 'swing';SELECT * FROM playground;// Output equip_id | type | color | location | install_date ----------+-------+-------+-----------+-------------- 2 | swing | red | northwest | 2010-08-16(1 row)



