You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

375 lines
12 KiB

#!/bin/bash
#
# Atualizar o PostgreSQL 9 para o 11
#
# |$ postgres --version
# |-> postgres (PostgreSQL) 9.2.24
#
# Será atualizado para versão 11.5
#
# deve ser rodado com root
#
# O script criará na pasta HOME .config_upgrade_postgres
# Nela terá as configurações para manter depois do upgrade
#
#
# .config_upgrade_postgres
# |
# |-- char_encoding_db
# | |
# | |-- enconding_9.txt = Guardar informações de codificação do postgresql 9
# | Essas codificações devem também ser usado para postgresql 11
# |
# |-- yum.repos.d
# |
# |-- (repositorios definidos).txt = Guardar as mudanças na pasta /etc/yum.repos.d/
# Essas mudanças devem ser retornadas
#
# ___ _ ___ _____ _ __ _ _ _
# ( _`\ ( )_ ( _`\ ( _ )( ) /'_ `\ ( `\ /' ) /' )
# | |_) ) _ ___ | ,_) __ _ __ __ ___ | (_(_)| ( ) || | ( (_) | ______ `\ `\ (_, |(_, |
# | ,__/' /'_`\ /',__)| | /'_ `\( '__) /'__`\/',__)`\__ \ | | | || | _ \__, | (______) > > | | | |
# | | ( (_) )\__, \| |_ ( (_) || | ( ___/\__, \( )_) || (('\|| |_( ) | | /' /' | | | |
# (_) `\___/'(____/`\__)`\__ |(_) `\____)(____/`\____)(___\_)(____/' (_) (_/' (_) (_)
# ( )_) |
# \___/'
echo "
____ ______ ___
/ )/ \/ \\
( / __ _\ )
\ (/ o) ( o) )
\_ (_ ) \ ) /
\ /\_/ \)_/
\/ //| |\\\\
v | | v
\__/
upgrade postgresql 9 -> 11
Empresa: SimplesIP
------------------------------"
# Cores no terminal (C_COR = cor da fonte) (C_BCOR = cor da fonte em negrito)
C_RED="\e[31m"; C_GREEN="\e[32m"; C_DEFAULT="\e[00m"; C_BGREEN="\e[1;32m"; C_BRED="\e[1;31m"
dir_config_upgrade_postgres=""
# Arquivo necessário de configuração do script
create_dir_config(){
dir_config_upgrade_postgres="${HOME}/.config_upgrade_postgres"
if [[ ! -d "${dir_config_upgrade_postgres}" ]];then
mkdir "${dir_config_upgrade_postgres}"
fi
if [[ ! -d "${dir_config_upgrade_postgres}/yum.repos.d" ]];then
mkdir "${dir_config_upgrade_postgres}/yum.repos.d"
fi
if [[ ! -d "${dir_config_upgrade_postgres}/char_encoding_db" ]];then
mkdir "${dir_config_upgrade_postgres}/char_encoding_db"
fi
}
# Desativa todos os repositórios yum menos pgdg-redhat-all.repo
# Isso foi colocado pois pode ter outros reposítório que pode
# atrapalhar na instalação do postgresql-11-server
disable_repository() {
# Deve retirar todos os repositórios por padrão
repo_yum=$(find /etc/yum.repos.d/ -type f )
for file in $repo_yum; do
if [[ "${file}" =~ "pgdg-redhat-all.repo" ]]; then
continue
fi
echo "$(grep -En "enabled=[01]" "$file")" > "${dir_config_upgrade_postgres}/yum.repos.d/$(basename ${file}).txt"
sed -i 's/enabled=1/enabled=0/g' ${file}
done
}
# Verifica qual usuário o script está rodando
# É obrigatório ser o root para instalação
is_root() {
user=`id -u`
#verifica se está coo root
if [[ $user -ne 0 ]]; then
echo -e ${C_BRED}"Esse script deve rodar com privilégios root "
echo -e "está sendo executado pelo `id -nu`" ${C_DEFAULT}
exit 1;
fi
}
# verificar se a variável de ambiente HOME existe
find_home() {
#variavel home
if [ -z ${HOME} ]; then
echo -e ${C_BRED}"HOME não encontrado"${C_DEFAULT}
exit 1;
fi
}
# Verifica se o postgresql 9 está rodando antes de começar o processo de upgrade
postgresql_running(){
running=$(systemctl status postgresql.service | awk 'NR==3 {print $3}')
if [[ $running == "(running)" ]]; then
echo -e ${C_BGREEN}"PostgreSQL está rodando"${C_DEFAULT}
elif [[ $running == "" ]] ;then
echo -e ${C_BRED}"Não existe postgresql.service em systemctl "${C_DEFAULT}
exit 1;
else
systemctl start postgresql.service
if [[ $? -ne 0 ]]; then
echo -e ${C_BRED}"Não foi possível iniciar postgresql"${C_DEFAULT}
exit 1
fi
echo "Postgresql iniciado"
fi
}
# A versão deve ser postgresql 9 para fazer upgrade
version_postgresql(){
version_postgres=$(sudo -iu postgres psql -c "SELECT version()"|awk '/PostgreSQL/ {print $1,$2}')
if [[ "$version_postgres" =~ "PostgreSQL 9." ]]; then
echo -e ${C_BGREEN}"Versão banco de dados: $version_postgres"${C_DEFAULT}
else
echo -e ${C_BRED}"Versão banco de dados: $version_postgres"${C_DEFAULT}
echo -e ${C_BRED}"Versão não suportado por esse script. Script de upgrade postgresql 9 -> postgresql 11"${C_DEFAULT}
exit 1
fi
}
get_char_encoding() {
echo "LC_COLLATE=$(sudo -iu postgres psql -c "SHOW LC_COLLATE;" | awk 'NR==3 {print $1}')" > ${dir_config_upgrade_postgres}/char_encoding_db/enconding_9.txt
echo "SERVER_ENCODING=$(sudo -iu postgres psql -c "SHOW SERVER_ENCODING;" | awk 'NR==3 {print $1}')" >> ${dir_config_upgrade_postgres}/char_encoding_db/enconding_9.txt
}
get_path_backup(){
echo "/var/lib/pgsql/backup_postgresql_9"
}
backup_postgresql_9(){
path_backup=$(get_path_backup)
echo -e ${C_BGREEN}"Salvando backup em ${path_backup}"${C_DEFAULT}
if [[ ! -d "${path_backup}" ]]; then
mkdir "${path_backup}"
fi
# backup database - pg_dumpall
sudo -iu postgres pg_dumpall > "${path_backup}"/backup_before_upgrade.bkp;n_return=$?
echo -e "${path_backup}/backup_before_upgrade.bkp: $([[ ${n_return} -eq 0 ]] && echo ${C_BGREEN}"ok"${C_DEFAULT} || echo ${C_BRED}"bad"${C_DEFAULT} )"
#testar erro
if [[ ${n_return} -ne 0 ]]; then
echo -e ${C_BRED}"fail command: sudo -iu postgres pg_dumpall > "${path_backup}"/backup_before_upgrade.bkp" ${C_DEFAULT}
exit 1
fi
#
# backup pasta /var/lib/pgsql/
mv /var/lib/pgsql/data "${path_backup}/backup_var_lib_pgsql_data" 2> /dev/null
set_pgdata_9 "${path_backup}/backup_var_lib_pgsql_data"
chmod -R 700 "${path_backup}/backup_var_lib_pgsql_data"
chown -R postgres:postgres "${path_backup}/backup_var_lib_pgsql_data"
echo -e ${C_BGREEN}"Feito backup \
verifique a pasta de backup ${path_backup} antes de continuar\
. . ." ${C_DEFAULT}
echo -e ${C_BGREEN}"Desejar continuar? (y)" ${C_DEFAULT}
read return_user
if [ $return_user == 'y' ]; then
echo -e "continuando . . ."
else
echo -e ${C_BGREEN}"Terminando o script"${C_DEFAULT}
exit 0
fi
}
# deve chamar $(get_pgdata_9) para retornar o echo
get_pgdata_9() {
directory_database_9=$(grep "Environment=PGDATA=/" /usr/lib/systemd/system/postgresql.service | awk -F = '{print $3}')
if [[ -z "${directory_database_9}" ]]; then
echo -e ${C_BRED}"Não foi encontrado a definição da variável de ambiente PGDATA em postgresql.service"${C_DEFAULT}
exit 1;
fi
#return
echo "${directory_database_9}"
}
set_pgdata_9() {
# $1 primeiro argumento será o novo caminho para o banco de dados
sed -i "s|Environment=PGDATA=.*|Environment=PGDATA=$1|g" /usr/lib/systemd/system/postgresql.service
if [[ $? -ne 0 ]];then
echo "Erro de mudar PGDATA no arquivo postgresql.service"
exit 1
fi
}
get_pgdata_11() {
directory_database_11=$(grep "Environment=PGDATA=/" /usr/lib/systemd/system/postgresql-11.service | awk -F = '{print $3}')
if [[ -z "${directory_database_11}" ]]; then
echo -e ${C_BRED}"Não foi encontrado a definição da variável de ambiente PGDATA em postgresql-11.service"${C_DEFAULT}
exit 1;
fi
#return
echo "${directory_database_11}"
}
set_pgdata_11(){
# $1 primeiro argumento será o novo caminho para o banco de dados
sed -i "s|Environment=PGDATA=.*|Environment=PGDATA=$1|g" /usr/lib/systemd/system/postgresql-11.service
if [[ $? -ne 0 ]];then
echo "Erro de mudar PGDATA no arquivo postgresql-11.service"
exit 1
fi
}
initdb_postgresql_11(){
echo "iniciar initdb"
server_encoding_=$(cat "${dir_config_upgrade_postgres}/char_encoding_db/enconding_9.txt" | awk -F = '/SERVER_ENCODING/ {print $2}')
lc_collate_=$(cat "${dir_config_upgrade_postgres}/char_encoding_db/enconding_9.txt" | awk -F = '/LC_COLLATE/ {print $2}')
sudo -iu postgres /usr/pgsql-11/bin/initdb -D /var/lib/pgsql/data -E "${server_encoding_}" --locale "${lc_collate_}"
set_pgdata_11 "/var/lib/pgsql/data"
}
install_postgresql11(){
#
# instalar postgresql-11
# initdb postgresql-11
# startup com OS e executa para ver teste
# https://www.postgresql.org/download/linux/redhat/
yum -y install \
http://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum -y install postgresql11-server >> /dev/null;n_return=$?
if [ $n_return -ne 0 ]; then
echo -e ${C_BRED}"Não foi possivel instalar PostgreSQL 11.5"
echo -e "return=${n_return}"${C_DEFAULT}
exit 1
fi
}
is_root
find_home
create_dir_config
disable_repository
postgresql_running
version_postgresql
get_char_encoding
backup_postgresql_9
install_postgresql11
initdb_postgresql_11
#
# O motivo desse trecho
# https://dba.stackexchange.com/a/86929
mv /usr/bin/pg_ctl /usr/bin/pg_ctl-orig
echo '#!/bin/bash' > /usr/bin/pg_ctl
echo '"$0"-orig "${@/unix_socket_directory/unix_socket_directories}"' >> /usr/bin/pg_ctl
chmod +x /usr/bin/pg_ctl
cd /var/lib/pgsql
systemctl stop postgresql-11
systemctl stop postgresql
#
# pg_upgrade
# https://www.postgresql.org/docs/11/pgupgrade.html
sudo -iu postgres /usr/pgsql-11/bin/pg_upgrade -v -b /usr/bin -B /usr/pgsql-11/bin -d $(get_pgdata_9) -D $(get_pgdata_11)
mv /usr/bin/pg_ctl-orig /usr/bin/pg_ctl
# delete posgresql antigo
#comentar teste yum -q -y erase postgresql-server >> /dev/null
cp -f $(get_pgdata_11)/pg_hba.conf $(get_pgdata_11)/pg_hba.conf.11
cp -f $(get_pgdata_11)/postgresql.conf $(get_pgdata_11)postgresql.conf.11
cp -f "$(get_pgdata_9)"/pg_hba.conf $(get_pgdata_11)/pg_hba.conf
cp -f "$(get_pgdata_9)"/postgresql.conf $(get_pgdata_11)/postgresql.conf
chmod -R 700 $(get_pgdata_11)
chmod -R 700 $(get_pgdata_9)
chown -R postgres:postgres $(get_pgdata_11)
chown -R postgres:postgres $(get_pgdata_9)
systemctl daemon-reload
systemctl start postgresql-11; n_return=$?
if [ ${n_return} -eq 0 ]; then
echo -e "PostgreSQL 11 inicializado:${C_BGREEN}ok"${C_DEFAULT}
else
echo -e "PostgreSQL 11 inicializado:${C_BRED}bad"${C_DEFAULT}
exit 1
fi
/var/lib/pgsql/analyze_new_cluster.sh
read -p "Remover postgresql 9 (y): " resposta
[ $resposta == "y" ] && yum remove -y postgresql
>/etc/profile.d/postgresql.sh
echo "export PATH=\"$PATH:/usr/pgsql-11/bin/\"" >> /etc/profile.d/postgresql.sh
rm -rf /var/lib/pgsql/11
echo "BIN= /usr/pgsql-11/bin"
echo "LIB= /usr/pgsql-11/lib"
echo "SHARE= /usr/pgsql-11/share"
echo -e "\e[36m script finalizado e PostgreSQL 11 funcionando" ${C_DEFAULT}