doc-sach kinh-nghiem-lap-trinh ghi-nhanh postgres sql - It costs 7 mins to read

Chương 1 - Managing Databases and the PostgreSQL Server

Postgres CLI

psql -h localhost -U postgres (-p PORT)

\q để thoát khi đang trong Postgres CLI

Create Database

SQL STATEMENT

CREATE DATABASE hrdb WITH ENCODING='UTF-8' OWNER=hr CONNECTION LIMIT=25;

CLI

createdb -h localhost -U postgres testdb1

List all Database in Postgres

SELECT datname from pg_database where datistemplate = false;
Create Users
CREATE USER hr with PASSWORD 'hr';
Create Schema

Schemas are among the most important objects with in a database. A schema is a named collecction of tables. A schema may also contain views, indexes, sequences, data types, operators, and functions. Schemas help organize database objects into logical groups, which helps make these object more manageable.

CREATE SCHEMA employee;
CREATE SCHEMA university AUTHORIZATION bob; (A schema named univerisy and is owned by bob)

Default Schema is public schema.

List all schema

\dn in psql

\du in psql (List all User)

Create Groups
CREATE GROUP dept;
ALTER GROUP dept ADD USER agovi1, nchabbra;
SELECT * FROM pg_group;
Destroying Database
DROP DATABASE hrdb;

CLI

dropdb hrdb
Tablespaces

A tablespace is a location on the disk where PostgreSQL stores data files containing database objects, for example indexes, tables, and so on.

CREATE TABLESPACE HRMS LOCATION '/var/lib/pgsql/data/hrms';

Moving Objects between tablespaces

ALTER DATABASE testdb1 SET default_tablespaces='hrms';
ALTER TABLE employee SET TABLESPACE hrms;
ALTER INDEX emp_idx SET TABLESPACE hrms;
Database Cluster

Database cluster is a collection of databases that are managed by a single server instance

Start and Stop SERVER

Các cách để khởi động và tắt SERVER (Trong đó có cách tắt khẩn cấp, Halt ngay lập tức, không kịp hoàn tất I/O ra Disk.)

Display the Server Status

Terminating connections

Có thể dùng để ngắt các phiên kết nối đang làm chậm Performance của Database.

Ngắt tất cả các phiên kết nối đến Database testdb1

SELECT pg_terminate_backend(pid) FROM pg_stat_activity where datnam='testdb1'

Also useful in free memory from idle postgress processes (pg_cancel_backend(pid) dùng để cancel running queries and not to terminate existing sessions)

Chương 2 - Controlling Security

Securing Database Objects

Bảo đảm chỉ có những authenticated users mới được truy cập đến data mà họ được cấp phép để truy cập.

Revoke - Thu hồi Grant - Cấp quyền

REVOKE ALL on testusers from testdb1;
REVOKE insert, update, delete, truncate on testusers from testdb1;

Các quyền có thể revoke hoặc grant là: SELECT, UPDATE, INSERT, DELETE, TRUNCATE, TRIGGER

Controlling access via firewalls

Cổng mặc định của PostgreSQL là 5432 (Cấu hình Firewall - Iptables open Port này)

Controlling access via configuration files

PostgreSQL có 2 file cấu hình chính

postgresql.conf - contains a single entry that controls on which network interfaces PostgreSQL listens for connections

pg_hba.conf - used to define which clients can connect to which database and using which login role

Show location of hba_files in Psql

SHOW hba_file;
SHOW data_directory;
Auditing Database Changes

Một bảng theo dõi toàn bộ sự thay đổi (Insert,Update,Delete) của các bảng khác, cái này rất tiện khi dùng để truy vết và blame cũng như restore lại một vài record.

Xem thêm tại - Audit Trigger Plus

Enabling SSL in PostgreSQL
Testing SSL Encryption

chưa rõ cụ thể là SSL để bảo vệ kết nối giữa client / server trong PostgreSQL hữu ích ra sao và nên sử dụng trong trường hợp nào, Tốc độ và hiệu suất có tốt hơn hay kém hơn? vì đa phần mình đều dùng localhost.

Encrypting confidential data
Cracking PostgreSQL Passwords

Chương 3 - Backup and Recovery

Logical Backups - Dump File được tạo ra bởi pg_dump

Physical Backups - OS level backup of a database directory and its associated files

Logical Backup
pg_dump -U username -W -Fc database_name > [Backup Location Path].dump

-W (Prompt for Password) -F (Output File -Fc for Custom Format)

Logical backup of all PostgreSQL databases

pg_dumpall -U postgres > [Backup Location Path]

option –schema-only, –roles-only, –tablespaces-only

Logical backup of specific objects

pg_dump -U postgres -W -F t ubrand > 1.tar -n audit

Xem thêm tại http://www.postgresql.org/docs/9.1/static/app-pgdump.html

File system level backup

The easiest way to do this is to make an archive of the PostgreSQL data directory or the directory defined by the $PGDATA environment variable.

Nhưng có một lưu ý là The database must be shutdown completely in order to get a useful backup. A File System backup is meaningful only when the database is in a consistent state.

Một cách khác hay hơn là tận dụng Logical Volume Manager để backup Data của PostgreSQL (Tham khảo thêm trong Sách)

Taking a base backup

pg_basebackup tool takes base backups of a running PostgreSQL database Server. These backups are initiated without affecting other PostgreSQL database clients and can be used for both point-in-time recovery, as well as the start point for log shipping or to stream replication standby servers.

pg_basebackup -h localhost -D directory

user phải có quyền replication trước khi thực hiện pg_basebackup

Cần phải config postgresql.conf max_wal_senders > 1 wal_level must be set to archive

pg_dump có cách sử dụng đơn giản nhưng Performance không tốt bằng pg_basebackup, đặc biệt là với Database lớn (>50GB), pg_dump trả về dump file

Backup và Archive Log của PostgreSQL dùng để Roll forward, hỗ trợ thêm cho Point-In-Time Recovery

Hot Physical Backup and Continous Archiving

Cho dù chúng ta backup thường xuyên đến cỡ nào thì khi sự cố xảy ra, nhiều khả năng là bản Backup gần nhất đã lỗi thời, và bạn không thể restore lại nguyên hiện trạng trước khi xảy ra sự cố được.

Enable WAL (Write-ahead Log)

Thay đổi cấu hình trong file postgresql.conf

wal_level = hot_standby archive_mode = on archive_command = ‘test ! -f /home/abcd/pgsql/backup_in_progress || (test ! -f /home/abcd/pgsql/archive/%f && cp %p /home/abcd/pgsql/archive/%f) ‘

==Phần này đọc thêm trong Sách và Xây dựng thành Một bài viết khác, đầy đủ, chi tiết hơn==

Point-in-time Recovery

Phục hồi lại với bản Backup gần nhất Sử dụng Kỹ thuật Point-in-time Recovery để hồi phục Database đến checkpoint mong muốn.

Restoring databases and specific database objects Thông qua pg_restore Utility

pg_dump / pg_restore

pg_dump -U username -f backup.dump database_name -Fc

switch -F specify format of backup file:

c will use custom PostgreSQL format which is compressed and results in smallest backup file size d for directory where each file is one table t for TAR archive (bigger than custom format)

Restore backup
pg_restore -d database_name -U username -C backup.dump

Parameter -C should create database before importing data. If it doesn’t work you can always create database eg. with command (as user postgres or other account that has rights to create databases) createdb db_name -O owner

pg_dump/psql

In case that you didn’t specify the argument -F default plain text SQL format was used (or with -F p). Then you can’t use pg_restore. You can import data with psql.

backup:

pg_dump -U username -f backup.sql database_name

restore:

psql -d database_name -f backup.sql

Chương 4 - Routine Maintenance Tasks

(Có thời gian sẽ đọc thêm)

Chương 5 - Monitoring the System Using Unix Utilities

Mình đã viết thành bài riêng tại http://notes.viphat.work/monitoring-linux-system/

Tham khảo thêm cách cài sysstat - http://www.thegeekstuff.com/2011/03/sar-examples/

Các chương còn lại cũng hay nhưng ở mức độ Advance nên mình chưa hiểu hết, sẽ đọc lại sau (Cũng hy vọng là mình sẽ có dịp làm việc với một Hệ thống Database lớn, lúc đó thì mới được dịp áp dụng các kiến thức ở những Chương sau):

Chương 6 - Monitoring Database Activity and Investigating Performance Issues (Theo dõi hoạt động của Database và điều tra các vấn đề về Performance)

Chương 7 - High Availability and Replication

(Nhân bản Database để mang lại độ sẵn sàng cao cho các ứng dụng Database lớn và nhiều người sử dụng)

Chương 8 - Connection Pooling

Chương 9 - Table Partioning (Phân vùng các Table, tách riêng và chia nhỏ Table nếu Table quá lớn, chứa nhiều dữ liệu)

Chương 10 - Accessing PostgreSQL from Perl

Chương 11 - Accessing PostgreSQL from Python

(Nếu có thời gian và có dịp, mình sẽ học thêm về Python. Hiện mình chủ yếu làm việc với Rails, còn Ruby thực ra còn nhiều cái chưa rành lắm… chẳng hạn, block_given? là gì?)

Chương 12 - Data Migration from Other Databases and Upgrading PostgreSQL Cluster