CONTENT
  • CHANGES
Szukaj
counter

#top Instalacja


Instalację serwera PostgreSQL można wykonać na różne sposoby: od kompilacji ze źródeł poprzez instalację pojedynczych paczek rpm za pomocą polecenia rpm skończywszy na instalacja z użyciem menedżera pakietów, który zainstaluje wszystkie niezbędne paczki wraz zależnościami.
Celem niniejszego dokumentu nie jest rozważanie różnych metod instalacji tylko nieco usprawnienie użyteczności konfiguracji serwera PostgreSQL po zainstalowaniu oraz wprowadzenie porządku / hierarchi położenia plików z których korzysta usługa w strukturze katalogowej..
Dobrą konwencją jest przechowywanie plików konfiguracyjnych każdego demona we własnym osobnym podkatalogu w katalogu etc, w przypadku instalacji PostgreSQLa z paczki w systemach Linux z rodziny RedHat taki katalog należy utworzyć i przenieć do niego pliki konfiguracyjne postgresql.conf, pg_hba.conf, pg_ident.conf po zainicjalizowaniu bazy danych (pliki tworzone są podczas inicjalizacji bazy danych). Podkatalog w katalogu etc jest sensowniejszą lokalizacją na pliki konfiguracyjne niż katalog w którym zapisane są dane.
Zgodnie definicja FHS: katalog /srv zawiera: Data for services provided by this system toteż jako katalog w którym PostgreSQL będzie przechowywał dane został wybrany: /srv/pgsql i zostanie on utworzony z odpowiednimi atrybutami.
Wszystko to zostało opisane poniżej.



#top Poinstalacyjna konfiguracja


#top keep oryginal start script


mv /etc/init.d/postgresql /etc/init.d/postgresql-rpm
cp -av /etc/init.d/postgresql-rpm /etc/init.d/postgresql


#top update start script


sed 's,\($SU -l postgres -c "$PGENGINE/pg_ctl reload.*\)$,echo -n "Reloading ${NAME} service:"\n    \1;res=$?\n    if [ "$res" = "0" ];then echo_success; else echo_failure; fi\n    echo,g' -i /etc/init.d/postgresql

Run below command only on CentOS 5.* system
sed 's,\[ $pid -a -e "/proc/$pid" \],[ "$pid" -a -e "/proc/$pid" ],g' -i /etc/init.d/postgresql
sed 's,\[ $pid \],[ "$pid" -a -e "/proc/$pid" ],g' -i /etc/init.d/postgresql

Run below command only on CentOS 6.* system
sed 's,\[ "x$pid" != x \],[ "x$pid" != x -a -e "/proc/$pid" ],g' -i /etc/init.d/postgresql



#top create config directory


mkdir -p /etc/postgresql


#top create /etc/sysconfig/pgsql/postgresql


###PGOPTS='-h 0.0.0.0 -c config_file="/etc/postgresql/postgresql.conf" -c hba_file="/etc/postgresql/pg_hba.conf" -c ident_file="/etc/postgresql/pg_ident.conf"'

touch /etc/sysconfig/pgsql/postgresql
echo "PGDATA=/srv/pgsql/data" >> /etc/sysconfig/pgsql/postgresql
echo "PGPORT=5432" >> /etc/sysconfig/pgsql/postgresql
echo "PGOPTS='-c config_file=\"/etc/postgresql/postgresql.conf\"'" >> /etc/sysconfig/pgsql/postgresql
echo "LANG=en_US.UTF-8" >> /etc/sysconfig/pgsql/postgresql
echo "LANGUAGE=en_US.UTF-8" >> /etc/sysconfig/pgsql/postgresql


#top create data directory


mkdir -p /srv/pgsql
chmod 700 /srv/pgsql
chown postgres:postgres /srv/pgsql


#top create log directory


mkdir /var/log/postgresql
chown postgres /var/log/postgresql
echo "PGLOG=/var/log/postgresql/pgstartup.log" >> /etc/sysconfig/pgsql/postgresql


#top initialize database


Run below command only on CentOS 5.* system (psql <=8.1.11):
su -l postgres -c "/usr/bin/initdb -D /srv/pgsql/data"

Run below command only on CentOS 6.* system (pgsql >=8.4.4):
/etc/init.d/postgresql initdb


#top post config data directory environment


cat > /srv/pgsql/.bash_profile << EOF
[ -f /etc/profile ] && source /etc/profile

PGDATA=/var/lib/pgsql/data
export PGDATA
EOF

chown postgres:postgres /srv/pgsql/.bash_profile
sed 's,PGDATA=/.*$,PGDATA=/srv/pgsql/data,g' -i /srv/pgsql/.bash_profile
sed 's,/var/lib/pgsql,/srv/pgsql,g' -i /etc/passwd


#top create/update config /etc/postgresql/ files


cp -av /srv/pgsql/data/postgresql.conf /etc/postgresql/postgresql.conf
cp -av /srv/pgsql/data/pg_ident.conf /etc/postgresql/pg_ident.conf
cp -av /srv/pgsql/data/pg_hba.conf /etc/postgresql/pg_hba.conf
echo >> /etc/postgresql/pg_hba.conf

sed "s,^\(.*hba_file .*\)$,hba_file = '/etc/postgresql/pg_hba.conf'\n\1,g" -i /etc/postgresql/postgresql.conf
sed "s,^\(.*ident_file .*\)$,ident_file = '/etc/postgresql/pg_ident.conf'\n\1,g" -i /etc/postgresql/postgresql.conf
sed "s,^\(.*listen_addresses .*\)$,listen_addresses = '0.0.0.0'\n\1,g" -i /etc/postgresql/postgresql.conf
sed "s,\(^log_directory.*$\),\nlog_directory = '/var/log/postgresql'\n#\1,g" -i /etc/postgresql/postgresql.conf
sed "s,\(^log_filename.*$\),\nlog_filename = 'postgresql-main%.log'\n#\1,g" -i /etc/postgresql/postgresql.conf
sed "s,\(^.*log_line_prefix.*$\),\nlog_line_prefix = '%t '\n\1,g" -i /etc/postgresql/postgresql.conf

przydatne, ale nie niezbędne:
#sed "s,^\(.*lc_messages .*\)$,lc_messages = 'en_US.UTF-8'\n\1,g" -i /etc/postgresql/postgresql.conf
#sed "s,^\(.*lc_monetary .*\)$,lc_monetary = 'en_US.UTF-8'\n\1,g" -i /etc/postgresql/postgresql.conf
#sed "s,^\(.*lc_numeric .*\)$,lc_numeric = 'en_US.UTF-8'\n\1,g" -i /etc/postgresql/postgresql.conf
#sed "s,^\(.*lc_time .*\)$,lc_time = 'en_US.UTF-8'\n\1,g" -i /etc/postgresql/postgresql.conf
#sed "s,^\(.*default_text_search_config .*\)$,default_text_search_config = 'pg_catalog.simple'\n\1,g" -i /etc/postgresql/postgresql.conf


#top create logrotate postgresql logs


cat > /etc/logrotate.d/postgresql << EOF
# logrotate postgresql-common
/var/log/postgresql/*.log {
	weekly
	rotate 10
	copytruncate
	nodelaycompress
	compress
	notifempty
	missingok
}
EOF


#top allow login any user to postgresql server


  1. METHOD=trust - without password
  2. METHOD=md5 - need password

(CentOS 5.3)
normaly connection to database need to be postgres user: sudo -u postgres psql -U postgres template1
  1. allow login any user to postgresql server (CentOS 5.3)

sed 's,^\(local.*\)ident sameuser,\1trust,g' -i /etc/postgresql/pg_hba.conf
psql -U postgres template1


(CentOS 6.0)
  1. allow login any user as postgres user to postgresql server (CentOS 6.0)
normaly connection to database need to be postgres user: sudo -u postgres psql -U postgres template1
  1. allowing any user login to postgresql server (CentOS 5.3)

sed -e 's,\(local.*all.*all.*\)ident,\1trust,g'  -e 's,\(host.*all.*all.*127.0.0.1/32.*\)ident,\1trust,g' -e 's,\(host.*all.*all.*::1/128.*\)ident,\1trust,g' -i /etc/postgresql/pg_hba.conf

/etc/postgresql/pg_hba.conf
# TYPE  DATABASE    USER        CIDR-ADDRESS          METHOD
# "local" is for Unix domain socket connections only
local   all         all                               trust
# IPv4 local connections:
host    all         all         127.0.0.1/32          trust
# IPv6 local connections:
host    all         all         ::1/128               trust



#top start server


/etc/init.d/postgresql start

tail -f /var/log/postgresql/pgstartup.log
tail -f /var/log/postgresql/postgresql-main.log

test connection
psql -U postgres template1

#top post config/cleaning environment


remove not needed privileges

#top set-all-grant-to-postgres


psql -U postgres template1 -f - << EOF
REVOKE ALL ON DATABASE template1 FROM public;
REVOKE ALL ON SCHEMA public FROM public;
GRANT ALL ON SCHEMA public TO postgres;
CREATE LANGUAGE plpgsql;
EOF


#top revoke-all-grant-public


psql -U postgres template1 -f - << EOF
REVOKE ALL ON pg_user FROM public;
REVOKE ALL ON pg_roles FROM public;
REVOKE ALL ON pg_group FROM public;
REVOKE ALL ON pg_authid FROM public;
REVOKE ALL ON pg_auth_members FROM public;

REVOKE ALL ON pg_database FROM public;
REVOKE ALL ON pg_tablespace FROM public;
REVOKE ALL ON pg_settings FROM public;

GRANT SELECT ON pg_database TO public;
GRANT SELECT ON pg_tablespace TO public;
EOF



#top create nagios3 database (for monitoring) + grant access to database


echo "host    nagios3     nagios3     10.5.5.5/32           md5" >> /etc/postgresql/pg_hba.conf
echo "host    nagios3     nagios3     10.41.0.250/32        md5" >> /etc/postgresql/pg_hba.conf

/etc/init.d/postgresql reload

psql -U postgres template1 -f - << EOF
CREATE ROLE "nagios3" NOSUPERUSER NOCREATEDB NOCREATEROLE NOINHERIT LOGIN ENCRYPTED PASSWORD 'nagios3';
CREATE DATABASE "nagios3" WITH OWNER="nagios3";
REVOKE ALL ON DATABASE "nagios3" FROM public;
EOF

psql -U postgres nagios3 -f - << EOF
GRANT ALL ON SCHEMA public TO "nagios3" WITH GRANT OPTION;
EOF


Run below command only on CentOS 5.* system (pgsql <= 8.1.11):
psql -U nagios3 nagios3 -f - << EOF
CREATE SEQUENCE nagios3_idkey_seq;
CREATE TABLE nagios3_table (
idkey integer not null DEFAULT NEXTVAL('nagios3_idkey_seq'),
name varchar(255)
);
INSERT INTO nagios3_table (name) VALUES ('column: name, row: 1');
EOF

Run below command only on CentOS 6.* system (pgsql >= 8.4.4):
psql "host=localhost user=nagios3 password=nagios3 dbname=nagios3" -f - << EOF
CREATE SEQUENCE nagios3_idkey_seq;
CREATE TABLE nagios3_table (
idkey integer not null DEFAULT NEXTVAL('nagios3_idkey_seq'),
name varchar(255)
);
EOF



#top test connection


Run below command only on CentOS 5.* system (pgsql <= 8.1.11):
echo '10.5.5.5:5432:nagios3:nagios3:nagios3' > $HOME/.pgpass; chmod go-rwx $HOME/.pgpass
psql -h 10.5.5.5 -U nagios3 nagios3
rm -f $HOME/.pgpass

echo '10.41.0.50:5432:nagios3:nagios3:nagios3' > $HOME/.pgpass; chmod go-rwx $HOME/.pgpass
psql -h 10.41.0.50 -U nagios3 nagios3
rm -f $HOME/.pgpass

echo '10.41.0.51:5432:nagios3:nagios3:nagios3' > $HOME/.pgpass; chmod go-rwx $HOME/.pgpass
psql -h 10.41.0.51 -U nagios3 nagios3
rm -f $HOME/.pgpass

echo '10.41.0.52:5432:nagios3:nagios3:nagios3' > $HOME/.pgpass; chmod go-rwx $HOME/.pgpass
psql -h 10.41.0.52 -U nagios3 nagios3
rm -f $HOME/.pgpass

Run below command only on CentOS 6.* system (pgsql >= 8.4.4):
psql "host=10.5.5.5   user=nagios3 password=nagios3 dbname=nagios3"
psql "host=10.41.0.50 user=nagios3 password=nagios3 dbname=nagios3"
psql "host=10.41.0.51 user=nagios3 password=nagios3 dbname=nagios3"
psql "host=10.41.0.52 user=nagios3 password=nagios3 dbname=nagios3"



#top psql - PostgreSQL interactive terminal


psql -U postgres postgres
psql -U postgres template1
psql -h 10.41.0.50 -U postgres template1
psql -h 10.41.0.50 -p 5432 -U postgres template1



#top multiple instances


cp -av /etc/init.d/postgresql /etc/init.d/postgresql2
NAME is a basename and include /etc/sysconfig/pgsql/$NAME, no need changes

cp -av /etc/sysconfig/pgsql/postgresql /etc/sysconfig/pgsql/postgresql2
sed -e 's,^PGDATA.*$,PGDATA=/srv/pgsql2/data,g' -e 's,^PGPORT.*$,PGPORT=5433,g' -e "s,^PGOPTS.*$,PGOPTS='-c config_file=\"/etc/postgresql/postgresql2.conf\"',g" -e 's,^PGLOG.*$,PGLOG=/var/log/postgresql/pgstartup2.log,g' -i /etc/sysconfig/pgsql/postgresql2


cp -av /etc/postgresql/postgresql.conf /etc/postgresql/postgresql2.conf
cp -av /etc/postgresql/pg_ident.conf /etc/postgresql/pg_ident2.conf
cp -av /etc/postgresql/pg_hba.conf /etc/postgresql/pg_hba2.conf

sed -e 's,/etc/postgresql/pg_hba.conf,/etc/postgresql/pg_hba2.conf,g' -e 's,/etc/postgresql/pg_ident.conf,/etc/postgresql/pg_ident2.conf,g' -e "s,^log_filename.*$,log_filename = 'postgresql2-main%.log',g" -i /etc/postgresql/postgresql2.conf


mkdir -p /srv/pgsql2
chmod 700 /srv/pgsql2
chown postgres:postgres /srv/pgsql2


Run below command only on CentOS 5.* system (pgsql <= 8.1.11):
su -l postgres -c "/usr/bin/initdb -D /srv/pgsql2/data"

Run below command only on CentOS 6.* system (pgsql >= 8.4.4):
/etc/init.d/postgresql2 initdb


/etc/init.d/postgresql2 start

tail -f /var/log/postgresql/pgstartup2.log
tail -f /var/log/postgresql/postgresql2-main.log



psql -U postgres template1
connect(3, {sa_family=AF_FILE, path="/tmp/.s.PGSQL.5432"...}, 110) = -1 ENOENT (No such file or directory)
connect(3, {sa_family=AF_FILE, path="/tmp/.s.PGSQL.5432"...}, 110) = 0

psql -p 5433 -U postgres template1
connect(3, {sa_family=AF_FILE, path="/tmp/.s.PGSQL.5433"...}, 110) = 0





Zmodyfikowany ostatnio: 2014/02/02 12:45:28 (10 lat temu), textsize: 12,6 kB, htmlsize: 26,6 kB

Zapraszam do komentowania, zgłaszania sugestii, propozycji, własnych przykładów, ...
Dodaj komentarzKomentarze użytkowników