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
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}
|
|
|