Baixe o app para aproveitar ainda mais
Prévia do material em texto
Administração do SGBD PostgreSQL Camila Freitas Sarmento Diretor Executivo DAVID LIRA STEPHEN BARROS Gerente Editorial CRISTIANE SILVEIRA CESAR DE OLIVEIRA Projeto Gráfico TIAGO DA ROCHA Autora CAMILA FREITAS SARMENTO A AUTORA Camila Freitas Sarmento Olá. Meu nome é Camila Freitas Sarmento. Sou formada em Telemática com mestrado em Ciência da Computação e, atualmente, doutoranda na área de Engenharia de Software, com uma experiência técnico-profissional na área de Soluções Digitais (Redes e Programação Back-End) de mais de sete anos. Atualmente sou Analista de Informática - Programadora Web Back-End no Instituto SENAI de Tecnologia em Automação Industrial (IST SENAI). Fui professora substituta na Universidade Estadual da Paraíba (UEPB) e atuei como professora substituta e, posteriormente, como tutora no Instituto Federal de Educação, Ciência e Tecnologia da Paraíba (IFPB). Sou apaixonada pelo que faço e adoro transmitir minha experiência àqueles que estão iniciando em suas profissões. Por isso, fui convidada pela Editora Telesapiens a integrar seu elenco de autores independentes. Estou muito feliz em poder ajudar você nesta fase de muito estudo e trabalho. Conte comigo!. ICONOGRÁFICOS Olá. Esses ícones irão aparecer em sua trilha de aprendizagem toda vez que: INTRODUÇÃO: para o início do desenvolvimento de uma nova compe- tência; DEFINIÇÃO: houver necessidade de se apresentar um novo conceito; NOTA: quando forem necessários obser- vações ou comple- mentações para o seu conhecimento; IMPORTANTE: as observações escritas tiveram que ser priorizadas para você; EXPLICANDO MELHOR: algo precisa ser melhor explicado ou detalhado; VOCÊ SABIA? curiosidades e indagações lúdicas sobre o tema em estudo, se forem necessárias; SAIBA MAIS: textos, referências bibliográficas e links para aprofundamen- to do seu conheci- mento; REFLITA: se houver a neces- sidade de chamar a atenção sobre algo a ser refletido ou dis- cutido sobre; ACESSE: se for preciso aces- sar um ou mais sites para fazer download, assistir vídeos, ler textos, ouvir podcast; RESUMINDO: quando for preciso se fazer um resumo acumulativo das últi- mas abordagens; ATIVIDADES: quando alguma atividade de au- toaprendizagem for aplicada; TESTANDO: quando o desen- volvimento de uma competência for concluído e questões forem explicadas; SUMÁRIO Banco de dados e índices ........................................................................10 O banco de dados .......................................................................................................................... 10 Conectando ao usuário de conexão do banco de dados no Windows ............................................................................................................................. 10 Conectando ao usuário de conexão do banco de dados no Linux ...................................................................................................................................... 14 O pgAdmin ........................................................................................................................ 18 Índices .....................................................................................................................................................22 Schemas, tablespaces e gerenciamento de usuários ................. 27 Schemas ...............................................................................................................................................27 Tablespaces ........................................................................................................................................35 Gerenciamento de usuários ................................................................................................... 36 Roles ......................................................................................................................................37 Privilégios .......................................................................................................................... 39 Inicialização e interrupção do PostgreSQL ..................................... 42 Inicialização do PostgreSQL ....................................................................................................42 Arquivo postgresql.conf .............................................................................................................43 Localização de arquivos .........................................................................................44 Conexões e autenticação .......................................................................................44 SSL ......................................................................................................................................... 46 Recursos de consumo ............................................................................................ 46 Atraso de vácuo baseado em custo ..............................................................47 Relatório e registro de erros ............................................................................... 48 Interrupção do PostgreSQL .................................................................................................... 49 Carga de dados no PostgreSQL .............................................................52 Transações PostgreSQL .............................................................................................................52 Uso do COPY FROM e ANALYSE ........................................................................................ 64 7 ARQUITETURA E FUNCIONAMENTO DO POSTGRESQL UNIDADE 02 8 INTRODUÇÃO Você sabia que o PostgreSQL é o Sistema Gerenciador de Banco de Dados de código aberto mais utilizado no mundo? É isso mesmo! Agora você sabe que as chances de uma empresa contratar um profissional que domine esse assunto são bem maiores por ser uma das mais demandadas na indústria. Sabia também que, apesar de a linguagem ser relativamente antiga (1986), ela está em constante evolução? Pois é! O grupo PostgreSQL permite que seus utilizadores contribuam com a correção de erros e melhorias da linguagem e, posteriormente, os avaliadores lançam uma nova versão. Quem sabe você não será o próximo profissional a sugerir modificações! Para isso, vamos aprender tudo direitinho, começando pela leitura do material. Vamos lá? Ao longo desta unidade letiva você vai mergulhar neste universo! 9 OBJETIVOS Olá. Seja muito bem-vindo à Unidade 2. Nosso objetivo é auxiliar você no desenvolvimento das seguintes competências profissionais até o término desta etapa de estudos: 1. 1. .Entender o conceito e a finalidade dos índices em um banco de dados PostgreSQL; 2. Gerenciar usuários e seus espaços de dados e esquemas no PostgreSQL; 3. Inicializar e interromper um banco de dados PostgreSQL; 4. Realizar carga de dados no PostgreSQL, visando processos de migração e povoamento de dados para testes. Então, preparado para uma viagem sem volta rumo ao conhecimento? Vamos conhecer mais desse assunto incrível e mais utilizado no mundo! Você não vai ficar de fora dessa, não é? Ao trabalho! 10 Banco de dados e índices INTRODUÇÃO: Ao término deste capítulo você será capaz de entender como funciona o PostgreSQL, de compreender a estrutura de funcionamento por meio da criação de tabelas de banco de dados e de entender conceitos e implementação de índices. Isso será fundamental para o exercício de sua profissão. As pessoas que tentaram até conseguiram êxito na criação, mas sem a devida instrução e com uma alta carga de dados, o sistema pode precisar de constantes ajustes, o que pode colocar o sistema de uma empresa inacessível por horas. Caso seja uma empresa totalmente online, cada minuto é crucial para a sustentabilidade de todos dentro do ecossistema empresa-funcionário-cliente. Agora, a responsabilidadeé toda sua para implementar e manter uma boa estruturação do banco de dados. E então, motivado para desenvolver esta competência? Vamos lá! O banco de dados Antes de aprendermos qualquer manipulação com o banco de dados, é essencial saber como manipular os arquivos de configuração que controlam as operações básicas de uma instância do servidor PostgreSQL. Dessa forma, mostraremos como realizar a configuração de conexão do usuário PostgreSQL ao banco de dados no Windows e no Linux. Nesse caso, você poderá ir para a seção de seu interesse. Posteriormente, vamos te mostrar como criar as tabelas de dados no banco de dados. Conectando ao usuário de conexão do banco de dados no Windows Se você já executou o processo de instalação no seu computador, vai ser fácil localizar o SQL Shell (psql). Basta encontrá-lo no Windows e abrir o terminal, como na Figura 1. 11 Figura 1 – SQL Shell no Windows Fonte: Elaborado pela autora. Passo a passo: Agora, vamos te mostrar como realizar a conexão. Ao abrir o terminal do psql, você vai ter que escolher o servidor, o banco de dados e a senha configurada. Você pode iniciar com a configuração padrão, isto é, você só precisa aceitar as sugestões e pressionar a tecla Enter. Vamos te mostrar: 1. Ao abrir o terminal, irá aparecer a mensagem: Server [localhost]. Nesse caso, é só apertar a tecla Enter para aceitar a configuração para o servidor local. 2. O próximo passo é a escolha da base de dados. No terminal terá Database [postgres], que você pode aceitar apertando Enter. 12 NOTA: O postgres é o superusuário do PostgreSQL que já vem, por padrão, na instalação. 3. Essa é a etapa da escolha da porta. Sugerimos deixar a porta padrão (5432) e, para aceitar, basta pressionar a tecla Enter. 4. Agora, você precisa escolher o usuário. Nesse caso, pode colocar o usuário que você criou durante a instalação pelo terminal em que praticou na Unidade passada. Caso não se lembre de como fazer, pode deixar a forma padrão mesmo, só pressionando a tecla Enter. 5. Este é um momento importante: a senha. Utilize a mesma que você configurou quando criou o usuário. E então, executou o passo a passo na sua máquina? Ficou conforme a Figura 2? O passo final é quando você entra na base de dados. Sabe como verificar? Vai aparecer no terminal (veja na Figura 2) o postgres=#. Figura 2 – Terminal após a inserção das informações de configuração Fonte: Elaborado pela autora. Prontinho! Viu como é fácil? Se você tiver alguma dúvida, poderá digitar help diretamente no terminal, então aparecerá uma série de sugestões de ajuda. Veja na Figura 3 as sugestões de ajuda do terminal. Figura 3 – Sugestões de ajuda do terminal Fonte: Elaborado pela autora. Como podemos ver na Figura 3, algumas opções de ajuda são: • \ para os termos de distribuição. 13 • \h para ajuda com os comandos SQL. • \? para ajuda com os comandos do psql. • \g ou terminar com um ponto e vírgula para executar uma query. • \q para sair. Caso você tenha digitado alguns comandos e não consegue sair da tela, pode pressionar as teclas ctrl + C para voltar ao postgres=#. Agora já podemos partir para a criação das tabelas no banco de dados, preparado? Antes disso, vamos ver como funciona a mesma configuração em um sistema Linux. Conectando ao usuário de conexão do banco de dados no Linux Como você já sabe, na instalação do PostgreSQL no Linux, o usuário do PostgreSQL já vem, por padrão, como superusuário postgre (isto é, com permissões de root do sistema). Sendo assim, vamos começar e nos conectar ao usuário postgre? Passo a passo: Para começar, você precisa digitar no terminal o comando de superusuário e entrar no usuário do postgres executando os seguintes passos: • Digite no terminal do Linux o comando sudo su - postgres e pressione a tecla Enter. Assim, você entrará no usuário do postgres para executar o próximo passo. • Entre na ferramenta padrão de acesso ao PostreSQL digitando psql, conforme a Figura 4. Figura 4 – Comando para acesso ao PostgreSQL Fonte: Elaborado pela autora. 14 NOTA: Perceba que o nome do usuário é postgres=#. O # significa que ele é um superusuário e isso é necessário para outras manipulações do banco de dados que iremos ver. Para um usuário comum, a representação seria a seguinte: usuário=>. Prontinho! Não é fácil? Tem dúvida e deseja ver qual usuário está conectado? Basta digitar select current_user; e depois pressionar a tecla Enter para ver o usuário ativo, conforme a Figura 5. Figura 5 – Identificando usuário ativo Fonte: Elaborado pela autora. Para verificar se houve a conexão com o PostgreSQL de forma correta, você pode digitar select inet_server_port(), assim, verá o retorno obtido. Veja a progressão dos comandos na Figura 6. Figura 6 – Identificando ativação Fonte: Elaborado pela autora. Ainda, podemos verificar qual porta o servidor está executando (ver Figura 7), por meio do seguinte comando: select current_ database();. Figura 7 – Identificando ativação Fonte: Elaborado pela autora. Para o caso da observação de versões do PostgreSQL, podemos coletar informações do sistema operacional, do banco de dados etc. Vamos ver quais informações o comando select version(); pode 15 nos retornar? Analise as Figuras 8 e 9 e responda: o que podemos compreender das versões a partir desse comando? Figura 8 – Comando para visualizar as versões Fonte: Elaborado pela autora. Figura 9 – Informações de versões Fonte: Elaborado pela autora. Você fez a mesma análise que eu? Vejamos: podemos observar que temos um PostgreSQL na versão 9.5.7 com o kernel Linux x86_64 em um sistema operacional Ubuntu server na versão 16.04.4. Então, entendeu tudo? Vamos agora compreender o que é o pgadmin, para que serve e qual é a sua relação com o PostgreSQL. O pgAdmin DEFINIÇÃO: De acordo com o próprio site (pgadmin.org), o pgAdmin é a plataforma de desenvolvimento e administração de código aberto mais popular e rica em recursos para PostgreSQL, o banco de dados de código aberto mais avançado do mundo que pode ser manuseado em Linux, Unix, MacOS e Windows. 16 O cliente pgAdmin pode acessar múltiplos servidores PostgreSQL, e um servidor PostgreSQL também pode ser acessado por vários clientes pgAdmin simultaneamente. Passo a passo: Ainda, o pgAdmin pode ser instalado por ambiente gráfico, automaticamente, durante a instalação do PostgreSQL no Windows, ou via terminal, instalando as dependências no Linux. Ficou curioso sobre como fazer a instalação no Linux? Vamos ver o passo a passo! 1. Digite no seu terminal Linux o comando sudo apt-get install python2.7-dev virtualenv python-pip libpq-dev, que vai instalar as dependências para o funcionamento. Figura 9 – Instalação das dependências no Linux Fonte: Elaborado pela autora. 2. Agora, vamos criar um diretório do boot com o comando mkdir -p ~/apps/pgadmin4/ e, em seguida, entrar no diretório com o comando cd apps/pdadmin4/ (ver Figura 10) para a instalação dos demais repositórios e, posteriormente, a inicialização da interface gráfica. Figura 10 – Criação do diretório do boot Fonte: Elaborado pela autora. NOTA: Lembrando que o pgadmin4 é a versão atual do pgAdmin. Futuramente, você poderá se deparar com novas versões. 3. Depois de criado o diretório, iremos utilizar o comando virtualenv venv -p /usr/bin/python2.7 para criar um ambiente isolado para evitar conflitos, bugs ou incompatibilidade de sistemas. Figura 11 – Criação do ambiente isolado 17 Fonte: Elaborado pela autora. 4. Pronto! Agora é só ativar com o comando source ./venv/ bin/activate. Para saber se está ativo, basta observar o (venv) antes da identificação do usuário postgres. Veja a Figura 12 para melhor compreensão. Figura 12 – Comando para a ativação Fonte: Elaborado pela autora. 5. Agora vamos fazer o download do pgAdmin com os seguintes comandos: wget https://ftp.postgresql. org/pub/pgadmin/pgadmin4/v1.5/pip/pgadmin4-1.5-py2.py3-none-any.whl, e, posteriormente, com o comando ls para listar o diretório para observar a orientação da pasta do próximo comando: pip install pgadmin4-1.5-py2.py3-none-any.whl. Veja melhor nas Figuras 13 e 14. Figura 13 – Download do pgAdmin Fonte: Elaborado pela autora. Figura 14 – Instalação do pgAdmin Fonte: Elaborado pela autora. Observe que o comando ls permitiu gerar o endereço (destacado em amarelo), e que inserirmos após o comando pip install (destacado em branco), conforme apresentado na Figura 14. 18 NOTA: Se você estiver utilizando uma máquina virtual (VirtualBox, por exemplo) ou realizando um acesso remoto, é necessário editar o documento config.inf para que o servidor permita o acesso. Contudo, utilize apenas para testes, em produção não é seguro. Com isso, terminamos a instalação. Para abrir o pgAdmin (ver Figura 15), basta digitar o seu IP seguido de : e o número da porta 5050. Por exemplo, digamos que seu IP seja 192.198.1.108. Então, o comando será: 192.198.1.108/5050. Figura 15 – Imagem do pgAdmin no navegador Fonte: Elaborado pela autora. NOTA: No sistema operacional Windows, basta ir ao menu de inicialização e procurar pelo diretório do PostgreSQL, no qual estará o pgAdmin. Agora, para finalizarmos totalmente e partimos para o próximo assunto, devemos instalar o phppgadmin (um agendador de tarefas para PostgreSQL que pode ser gerenciado usando o pgAdmin) com o comando apt-get install phpphadmin, conforme podemos ver na Figura 16. Figura 16 – Instalação do phppgAdmin Fonte: Elaborado pela autora. Você realizou a instalação? Vale lembrar que, caso o pgAdmin solicite senha, é só inserir a mesma que você utilizou no processo de instalação do PostgreSQL na Unidade anterior. Depois de tudo instalado na sua máquina, está ansioso para colocar a mão na massa? Vamos para o próximo assunto! Índices 19 DEFINIÇÃO: A documentação do PostgreSQL, disponível online (http:// pgdocptbr.sourceforge.net/) e traduzida para o português brasileiro, afirma que os índices são um modo comum de melhorar o banco de dados e permitem que o servidor de banco de dados localize e retorne linhas selecionadas em um tempo mais hábil. Contudo, é recomendável a utilização com moderação, pois os índices podem produzir esforço adicional para o sistema de banco de dados. Sendo assim, para uma melhor compreensão do funcionamento dos índices, é essencial sabermos como manipular as tabelas do banco de dados. Você pode ter visto em outros momentos do curso, mas vale reforçar, pois é de extrema importância saber manusear as tabelas. Primeiramente, vamos ver como criar! Para criar a estrutura de uma tabela, há algumas regras de nomeação. Nesse caso, não devemos duplicar os nomes dos objetos do mesmo proprietário. Outra consideração importante é que, para os nomes de tabelas e de colunas, sugere-se iniciar com uma letra e conter somente os seguintes símbolos: A_Z, a_z, 0_9, _, $, e #. Como você viu na Unidade anterior, uma tabela é composta por linhas e por colunas nomeadas, cujo número e ordem de apresentação são fixos. Contudo, o número de linhas pode variar conforme a expansão do banco de dados, refletindo nessa quantidade armazenada. Ainda, para os valores que são atribuídos à coluna dos dados, há um tipo de dado associado. Vejamos a sintaxe: CREATE TABLE nome_tabela ( coluna1 tipoDoDado, coluna2 tipoDoDado, coluna3 tipoDoDado, .... 20 IMPORTANTE: Devemos também levar em consideração: a chave primária, que considera como identificador único para as linhas da tabela; a chave estrangeira, que especifica o valor correspondente em uma linha de outra tabela, e o valor não nulo, que especifica que uma coluna não poderá receber o valor nulo. Vejamos uma demonstração com a chave primária, estrangeira e não nulo. Tente identificar qual delas é a chave estrangeira e o porquê: CREATE TABLE professores ( professorID integer NOT NULL PRIMARY KEY, professorNome varchar(255), professorSobrenome varchar(255), professorDisciplina varchar(255) NOT NULL, Conseguiu identificar a chave estrangeira? Se você respondeu ProfessorDisciplina, por estar associada à outra tabela, acertou! Devemos levar em consideração, para o banco de dados, que, quando um valor é adicionado ao banco, isto é, quando uma linha é criada, e nenhum valor é especificado para determinadas colunas, você pode automatizar para adicionar um valor padrão. Vejamos: CREATE TABLE pessoas ( pessoaID integer NOT NULL, pessoaNome varchar(255), pessoaSobrenome varchar(255) DEFAULT ‘NA’, pessoaCPF varchar(255), 21 DEFINIÇÃO: Além do valor DEFAULT, existe o AUTO_INCREMENT para a chave primária, que é utilizado para incrementar automaticamente o valor do campo quando uma linha é adicionada. Tratando-se de índices, há vários tipos, e cada Sistema Gerenciador de Banco de Dados pode administrar seus próprios tipos de índices. Para o nosso caso, vamos considerar o índice do PostgreSQL. Mas você já sabia disso, não é mesmo? Vamos ver um exemplo! Exemplo: Vamos supor que temos a seguinte tabela no banco de dados: CREATE TABLE professores ( professorID integer NOT NULL PRIMARY KEY, professorNome varchar(255), professorSobrenome varchar(255), professorDisciplina varchar(255) NOT NULL, E foi emitida a seguinte requisição: SELECT ProfessorNome FROM professores WHERE professor- Dessa forma, poderá haver desperdício de processamento, pois se formos considerar múltiplas requisições para retornar na consulta uma única – ou nenhuma – linha correspondente para o ID do professor (professorID), então o SGBD teria que procurar em cada linha da tabela professores. Então, o que poderíamos fazer para otimizar esse serviço? Simplesmente criar o comando para gerar índices. Vejamos: CREATE INDEX idx_professores_professorID ON profes- 22 Assim, a busca, em vez de varrer toda a tabela, irá procurar somente nos campos de interesse, cujo nome idx_professores_professorID é apenas uma recomendação, pois a nomeação é livre. Contudo, sugere- se que escolha um nome que torne possível associar com o objetivo do índice posteriormente. Para o caso de remover o índice criado, basta utilizar o comando DROP INDEX, assim como para os comandos de atualização UPDATE e de remoção DELETE. SAIBA MAIS: Quer se aprofundar neste tema? O PostgreSQL também tem vários tipos de índices, como: B-tree (árvore B), R-tree (árvore R), hash e GIST, e cada um deles utiliza seu próprio algoritmo. Quer saber mais sobre eles? Acesse o conteúdo pelo link: http://pgdocptbr.sourceforge.net/pg80/indexes- types.html (Acesso em 10 ago. 2020). RESUMINDO: E então, gostou do que mostramos? Aprendeu mesmo tudinho? Agora, só para termos certeza de que você realmente entendeu o tema de estudo deste capítulo, vamos resumir tudo o que vimos. Você deve ter aprendido que, antes de manipular um banco de dados, é necessário conectar o usuário ao banco de dados. Dessa forma, apresentamos um passo a passo de como realizar essa conexão a partir dos sistemas operacionais Windows e Linux. Também conhecemos o pgAdmin, que pode acessar múltiplos servidores PostgreSQL, e um servidor PostgreSQL também pode ser acessado por vários clientes pgAdmin simultaneamente. Além disso, mostramos como realizar a instalação do pgAdmin em linha de código com posterior abertura do ambiente gráfico. Também vimos como criar uma tabela em um banco de dados e a utilidade das chaves primária e secundária. Por fim, estudamos a importância do uso de índices em bancos de dados, pois com ele é possível otimizar as consultas e melhorar o desempenho do banco de dados. 23 Schemas, tablespaces e gerenciamento de usuários INTRODUÇÃO: Agora que você já sabe como criar um usuário e como conectá-lo a um banco e ao PostgreSQL, já crioutabelas e viu como otimizar buscas com índices, vamos para o próximo passo. Ao término deste capítulo, você será capaz de compreender o funcionamento de schemas e tablespaces e administrar usuários e banco de dados por interface gráfica e por linhas de comando. Além disso, irá aprender a trabalhar com recursos de autenticação e de atribuição de regras e privilégios. Você sabia que esse tipo de trabalho é extremamente importante para uma empresa? Pois é! Por meio desses recursos, é possível proteger os dados da empresa conforme a permissão de cada funcionário, o que é uma grande responsabilidade. Então, vamos lá! Schemas DEFINIÇÃO: Um Schema (ou esquema) é um namespace que organiza o banco de dados em grupos lógicos e que pertence a um usuário do banco de dados, isto é, os objetos. Contudo, não interfere na forma com que os dados são armazenados. A documentação do PostgreSQL define schema como um agrupamento de dados que contém nome e em que os usuários e os grupos de usuários são compartilhados por todo o agrupamento. Entretanto, isso não significa que os usuários de um agrupamento possam acessar todos os bancos de dados do agrupamento, a possibilidade existe apenas quando configurado no sistema de gerenciamento de usuários. 24 Em um schema, os acessos ao banco de dados, em todas as conexões dos clientes com o servidor, só são permitidos para aqueles que foram especificados durante o pedido de conexão. Dessa forma, é possível utilizar o conceito de cross-database, ou seja, fazer consultas em SQL ao banco realizando cruzamento de informações entre campos de tabelas que estão em banco de dados diferentes. Em grandes aplicações, o uso de schema também permite que softwares desenvolvidos por terceiros fiquem logicamente separados para não ocorrer colisão com os nomes de outros objetos existentes no banco de dados. Vamos ver como criar um schema? CREATE SCHEMA nome_esquema; Exemplo: Também podemos criar esquemas exclusivos para determinados para usuários. Vejamos: CREATE SCHEMA AUTHORIZATION camila; Nesse caso, o esquema será autorizado para o usuário camila e, consequentemente, terá o mesmo nome. Entretanto, podemos criar um esquema com outro nome e que pertença ao usuário Camila. CREATE SCHEMA IF NOT EXISTS novo_esquema AUTHORIZATION Pronto! Criamos um schema chamado novo_esquema para o usuário camila. O IF NOT EXISTS verificará se não há outro esquema com o mesmo nome. Para melhor organização dos dados, é possível criar um schema com uma tabela e uma visualização da seguinte forma: CREATE SCHEMA universo CREATE TABLE marvel (personagem, principal poder,filmes[]) CREATE VIEW melhores AS SELECT personagem FROM marvel WHERE prin- 25 Observe que os subcomandos não estão com ponto e vírgula. Você também poderá se deparar com a seguinte forma de schema que obtém o mesmo resultado: CREATE SCHEMA universo; CREATE TABLE universo.marvel (personagem, principal poder,filmes[]); CREATE VIEW melhores AS SELECT personagem FROM universo.marvel WHERE principal poder IS NOT NULL; Caso for necessário remover os schemas do banco de dados, há duas formas: removendo um schema vazio e removendo um schema e todos os seus objetos. Exemplo: Vejamos o caso em que todos os esquemas serão removidos, considerando que os objetos já foram removidos: DROP SCHEMA universo; O comando para remover o schema e todos os seus objetos não difere muito, só acrescentamos a palavra CASCADE. Vejamos: DROP SCHEMA universo CASCADE; Você sabia que, além de criar um schema por linhas de comando, também podemos criar em ambiente gráfico? Tem alguma ideia de onde? Se você respondeu pelo phppgadmin, acertou! Por isso que falamos do pgAdmin e do phppgadmin no capítulo anterior. Lembra-se disso? Então, agora que você já viu os comandos em linhas de comando, vamos mostrar como criar schemas a partir de um ambiente gráfico, o phppgadmin. Veja o passo a passo: Passo a passo: 26 1. No phppgadmin, expanda o banco de dados em que deseja criar um schema. Em Schemas, clique com o botão direito do mouse e depois em Create > Schema ... (conforme observado na Figura 17). Figura 17 – Criando um schema Fonte: Elaborado pela autora. 2. Após isso, será aberta uma janela para a inserção dos dados do s chema desejado. Lembra-se do que falamos para os usuários dos schemas em linhas de comando? A regra para o ambiente gráfico é a mesma. Então, você precisará preencher com o nome do Schema, o usuário e um comentário. Figura 18 – Preenchendo um schema Fonte: Elaborado pela autora. 27 3. Depois de preenchido, podemos observar que o schema criado posicionou-se após o schema público. Figura 19 – Schema criado Fonte: Elaborado pela autora. Para criar as tabelas dentro de um schema em um ambiente gráfico, o procedimento também é simples. Veja o passo a passo: Passo a passo: 1. Basta procurar o schema de interesse, buscar o agrupamento das tabelas no menu expandido e clicar com o botão direito do mouse indo até Create e depois até Table... (vejamos na Figura 20). Figura 20 – Schema criado Fonte: Elaborado pela autora. 2. Com isso, a janela de preenchimento da tabela é aberta com os campos para o preenchimento. Nela, é possível criar de forma gráfica ou por meio do comando SQL, para os casos em que a linha de comando é gerada automaticamente, ou é possível modificá-la manualmente. Veja a Figura 21 com os campos preenchidos, e na Figura 22 a opção de criação gerada automaticamente após o preenchimento dos campos. Figura 21 – Criação da tabela Fonte: Elaborado pela autora. Figura 22 – Comando SQL para gerar tabela 28 Fonte: Elaborado pela autora. Viu como é tudo muito prático? Perceba que na Figura 22 foi gerado o tablespace pg_default, que será nosso próximo assunto. Vamos lá! Tablespaces DEFINIÇÃO: Um tablespace (ou espaços da tabela) pode ser considerado um contêiner para dados, cujos espaços na tabela do PostgreSQL possibilitam aos superusuários definirem o local, no sistema de arquivos, em que os arquivos dos objetos de banco de dados podem ser armazenados. Depois de criado o tablespace, é possível atribuir nomes lógicos aos locais físicos no disco rígido do servidor e, assim, facilitar a referenciação dos objetos de banco de dados. A inicialização de um cluster PostgreSQL envolve, automaticamente, duas formas de guardar os dados, cujo tablespace é chamado de pg_ default, para guardar todos os dados do usuário, e de pg_global, para guardar todos os dados do sistema que é visto por todos os bancos de dados. Por padrão, os tablespaces ficam localizados no mesmo diretório do seu cluster, mas você pode armazenar em qualquer disco do servidor, além de permitirem que você mova os objetos de banco de dados existentes para novos. Para definir um espaço de tabela, você utilizará o comando CREATE TABLESPACE. Vale ressaltar que o espaço deverá ser um diretório vazio pertencente ao usuário do PostgreSQL e que todos os objetos criados no tablespace serão armazenados em arquivos sobre o diretório especificado. 29 Ainda, o local escolhido deverá possibilitar o armazenado removível, pois o cluster não funcionará caso o tablespace esteja ausente ou perdido. Exemplo: Ficou curioso? Vejamos um exemplo de execução: CREATE TABLESPACE second LOCATION ‘/var/lib/post- Lembre-se de que o usuário que você utilizar para criar o tablespace deverá ter a permissão de salvar. Note que agora o seu banco de dados será salvo em /var/lib/postgresql/9.5/. Agora, a partir da versão 9.4, é possível mover um grupo de objetos de um tablespace para outro. Por exemplo, para os casos em que você já tenha criado o banco de dados e deseja mover todos os objetos do banco de dados para o tablespace criado, então, podemos definir da seguinte forma: ALTER DATABASE meuDB_anterior SET TABLESPACE second; Nos casos em que se deseja mover todo o banco de dados: objetos,schemas, tabelas etc., você utilizará o seguinte comando: ALTER TABLESPACE pg_default MOVE ALL TO second; NOTA: Durante a migração com o MOVE ALL TO, todo o banco de dados ficará bloqueado temporariamente. Gerenciamento de usuários Uma questão bastante importante em banco de dados é o gerenciamento de usuários, pois em toda grande aplicação, um banco de 30 dados pode ser acessado por vários usuários e, por motivos de segurança, é necessário implementar controle de acessos. Lembra-se de como criamos os superusuários e fizemos a conexão com o servidor no capítulo anterior? Eles que obtêm controle dos objetos de banco de dados, como tabelas e visões, além de poderem conceder privilégios de acesso. Diante do assunto de gerenciamento de usuários, para um bom gerenciamento do banco de dados, devemos ter em mente quem são os usuários e os grupos de usuários e qual a função de cada um atua no contexto da segurança do banco de dados. Sendo assim, vamos primeiramente conhecer usuários e grupos no PostgreSQL, e depois, a conceder privilégios. Roles Tratando-se de usuários e de grupos, um bom gerenciamento é essencial para o banco de dados. Em versões anteriores do PostgreSQL, os usuários e os grupos de usuários eram entidades de tipos distintos, ou seja, utilizavam USER e GROUP. IMPORTANTE: Atualmente (a partir da versão 8.1), são utilizadas as roles, que podem atuar como um usuário e/ou um grupo. Contudo, não elimina o uso dos comandos CREATE USER e CREATE GROUP por questões de compatibilidade, mas é interessante que vejamos os comandos mais atuais. Nesse sentido, veremos como criar e gerenciar usuários por meio de roles. Você já sabe que na instalação do PostgreSQL, por padrão, já é criado o superusuário postgres. Agora, vamos ver como criar usuários comuns. Vejamos como criar um usuário com senha que pode ser utilizado até uma data específica ou por tempo indeterminado: CREATE ROLE camila LOGIN PASSWORD ‘0123456’ CREATEDB VALID UNTIL ‘infinity’; 31 Olhando para o comando, sabe o que significa CREATEDB VALID UNTIL ‘infinity’? Esse termo quer dizer que a validade daquele usuário é por tempo infinito, isto é, indeterminado. Exemplo: Ainda, é possível criar outro superusuário além do postgres. Vejamos um exemplo: você é um administrador que usa o superusuário postgres e precisa conceder privilégios de superusuário a um colega com contrato predefinido. Então, para que você não forneça suas credenciais, poderá executar um comando exclusivamente para ele com tempo determinado. Vamos supor que o usuário seja Harry Potter e a data de expiração seja 1º de janeiro de 2025. CREATE ROLE potter LOGIN PASSWORD ‘0123456’ SUPERUSER VALID UNTIL ‘2025-1-1 00:00’; Caso você deseje remover algum usuário (até mesmo antes da data de expirar), pode utilizar o seguinte comando: DROP ROLE camila; NOTA: Uma role pode ter e ser contida por outra role. Para o caso de grupos de usuários, você também pode considerar a criação de um grupo que receba determinados privilégios. Veja: CREATE ROLE grupo1 INHERIT; O INHERIT significa que qualquer membro do grupo1 terá, automaticamente, direitos concedidos ao papel do grupo1, exceto para superusuário. 32 Então, podemos fazer a seguinte pergunta: como associar o usuário Hermione, que foi recém-criado, ao grupo1? Simples! Utilizando o comando GRANT. Vejamos: GRANT grupo1 TO hermione; Gostou do que aconteceu com Hermione sendo adicionada ao grupo e ganhando privilégios do grupo automaticamente? Bem prático, não é mesmo? O comando GRANT faz parte do assunto sobre privilégios. Privilégios No PostgreSQL os privilégios precisam de um pouco mais de atenção devido ao controle minucioso que ele tem. Alguns dos privilégios de nível de objeto usam os seguintes comandos: SELECT, INSERT, UPDATE, ALTER, EXECUTE, TRUNCATE, e um qualificador para os chamados WITH GRANT. Vejamos a sintaxe: GRANT nome_privilegio TO alguma_role; Exemplo: Agora, para entender melhor o uso e os termos, vamos ver um exemplo prático em um passo a passo com alguns comandos com os quais você já está familiarizado: 1. Inicialmente, devemos criar um usuário e uma senha com o comando: CREATE ROLE admin LOGIN PASSWORD ‘0123456’; 2. Agora, precisamos do banco de dados, então, vamos criar um chamado meubd, de propriedade do usuário admin. Ao afirmar que um usuário é owner de um banco de dados, significa que ele já recebeu todos os privilégios. CREATE DATABASE meubd WITH owner = admin; 33 NOTA: Ao criar o banco de dados, é necessário entrar nele para gerar os comandos GRANT. Nesse caso, utilize o comando \c meubd. Agora, criaremos um schema do banco de dados: CREATE SCHEMA meu_schema; 3. Já podemos utilizar o comando GRANT para conceder privilégios ao usuário admin: GRANT ALL ON ALL TABLES IN SCHEMA IN SCHEMA meu_schema TO admin WITH GRANT OPTION; Com isso, o usuário admin poderá conceder privilégios de alterações a outros usuários no schema meu_schema dentro do banco de dados meubd. O inverso também poderá acontecer com o comando REVOKE, que remove os privilégios. Para trabalhar com o GRANT existem algumas premissas: você precisa ser o titular do privilégio que está concedendo e também deve ter o poder de conceder privilégios. Para os comandos DROP e ALTER, os privilégios sempre permanecem com o proprietário de um objeto e nunca podem ser concedidos. 34 SAIBA MAIS: Quer se aprofundar neste tema? Você pode acessar o conteúdo acessível pelo link https://tinyurl.com/yy2vj43k (Acesso em: 15 ago. 2020). RESUMINDO: Chegamos ao fim do nosso capítulo. Gostou do que mostramos? Agora, vamos recapitular tudo. Nós falamos sobre o funcionamento de schemas, que são agrupamentos lógicos do banco de dados que o superusuário pode manipular. Sabemos que, com o uso de schemas, é possível melhorar a segurança do nosso banco de dados, pois, por meio deles, podemos separar aplicações desenvolvidas por terceiros simplesmente criando um schema e deixando-as logicamente separadas para não ocorrer colisão com os nomes de outros objetos existentes no banco de dados. Também vimos o conceito de tablespaces e como manipulá-lo, administrando usuários e banco de dados por interface gráfica e por linhas de comando. Por fim, vimos como trabalhar com recursos de autenticação e de atribuição de regras e de privilégios. http://https://tinyurl.com/yy2vj43k 35 Inicialização e interrupção do PostgreSQL INTRODUÇÃO: Agora que você já sabe como administrar usuários, como otimizar uma busca por meio de shemas e como controlar acessos, vamos para o próximo passo. Ao término deste capítulo você será capaz de compreender e de realizar a inicialização e a interrupção do PostgreSQL, além de conhecer os principais parâmetros do arquivo postgresql. conf. Você também irá aprender a parar e a reiniciar o servidor PostgreSQL usando estratégias smart, fast e immediate e a aplicar o comando kill. Você sabia que qualquer operação prévia de acesso ao banco de dados exige a inicialização do servidor PostgreSQL? Sem isso, poderá impedir a execução das atividades de acesso ao banco de dados. Pois é! Isso requer uma série de procedimentos que você precisa executar para realizar uma boa administração do banco de dados. E então, motivado para desenvolver essa competência? Vamos lá! Inicialização do PostgreSQL Você já sabe que qualquer operação prévia de acesso ao banco de dados demanda a inicialização do servidor. Há várias formas de inicializar o PostgreSQL, mas o nome padrão para uso por utilitários, usuários e aplicativos terceiros é postgres. Assim, você poderá fazer isso por meio do seguinte comando: Postgres -D /bd/data Ele executará o PostgreSQL em primeiro plano enquanto estiver com conexão ativa ao usuário do PostgreSQL. Para o caso da execução em background, o seguinte comando poderá ser utilizado: Postgres & 36 Para corroborar com a auditoria e facilitaro diagnóstico de problemas, é fundamental armazenar a saída stdout e stderr do servidor em um arquivo de log. Para isso, você poderá utilizar o seguinte comando: Postgres -D /bd/data > postgresql.log 2 > &1 & Entretanto, há uma forma muito simples de inicializar o PostgreSQL em background e enviar o stdout e stderr para um arquivo de log, que é usando o utilitário pg_ctl. Sendo assim, é necessário realizar a configuração para o armazenamento no arquivo postgresql.conf e, dessa forma, utilizar apenas uma linha de comando para a inicialização: pg_ctl start De acordo com a documentação do PostgreSQL, o pg_ctl é um utilitário que pode ser utilizado para mostrar o status de um servidor ativo e para iniciar, parar ou reiniciar o PostgreSQL. Além de o pg_ctl poder utilizar a saída padrão para um arquivo de log, é possível fornecer opções para uma parada controlada. Arquivo postgresql.conf Ainda, o superusuário pode configurar algumas variáveis pelo arquivo postgre.conf (ou diretamente na linha de comando) para abordar conceitos de dimensionamento, para itens de hardware que estão operando, e de autenticação do cliente, para controlar a autenticação de clientes etc. Para visualizá-los, em pg_settings, filtre por postmaster. Dessa forma, a partir da documentação pública disponibilizada pelo PostgreSQL (2019) em seu domínio (disponível em https://www. postgresql.org), listamos as principais utilizadas: Localização de arquivos http://https://www.postgresql.org http://https://www.postgresql.org 37 A localização de arquivos é suportada a partir da versão 9.5 do PostgreSQL, e sua versão atual é a 12, com a 13 já em desenvolvimento. Por meio da localização de arquivos é possível que os backups dos arquivos de configuração sejam realizados de forma correta quando mantidos separadamente. Vejamos as configurações possíveis (disponibilizadas na documentação do PostgreSQL), cujas parametrizações só podem ser definidas na inicialização do servidor: • data_directory: especifica o diretório a ser usado para armazenamento de dados. • config_file: só pode ser definido por meio da linha de comando e especifica o arquivo de configuração do servidor principal. • hba_file: especifica o arquivo de configuração para autenticação baseada em host, comumente chamado de pg_hba.conf. • ident_file: comumente chamado de pg_ident.conf, especifica o arquivo de configuração para mapeamento de nome de usuário. • external_pid_file: especifica o nome de um arquivo de ID de processo (PID) adicional que o servidor deve criar para uso por programas de administração de servidor. Conexões e autenticação As conexões e a autenticação envolvem a administração do número de slots de conexão que são reservados para superusuários, soquete, grupo do proprietário, porta, número máximo de conexões etc. Vejamos as principais: • port: é o número da porta TCP na qual o servidor escuta. Por padrão, é 5432. • max_connections: define o número máximo de conexões simultâneas com o PostgreSQL. O padrão de inicialização é 38 de 100 conexões máximas. Contudo, pode ser configurável caso as configurações do kernel não suportem. • listen_addresses: define o(s) endereço(s) TCP / IP no(s) qual(is) o servidor deve escutar conexões de aplicativos cliente, cuja entrada 0.0.0.0 são para endereços IPv4 e : : para IPv6. • superuser_reserved_connections: especifica o número de slots de conexão que são reservados para conexões de superusuários do PostgreSQL, cujo valor padrão é de 3 conexões. • unix_socket_directories: define o diretório do(s) soquete(s) do domínio Unix no(s) qual(is) o servidor deve escutar as conexões dos aplicativos clientes, e vários sockets podem ser criados listando vários diretórios separados por vírgula. Ainda, esse parâmetro é irrelevante no Windows, pois não tem soquetes de domínio Unix. • unix_socket_group: especifica o grupo proprietário do(s) soquete(s) do domínio Unix. Vale considerar que o usuário proprietário é sempre o que inicia o servidor. • unix_socket_permissions: especifica as permissões de acesso do(s) soquete(s) do domínio Unix, cujas permissões padrões são: • 0777: qualquer pessoa pode se conectar. • 0700: somente usuário. • 0770: somente usuário e grupo. • Bonjour: permite anunciar a existência do servidor via Bonjour. • Bonjour_name: especifica o nome do serviço Bonjour. Caso o servidor não seja compilado com suporte Bonjour, esse parâmetro é ignorado. 39 • password_encryption: determina o algoritmo a ser usado para criptografar a senha, cujo padrão é md5. Apenas quando a senha é especificada em CREATE ROLE ou ALTER ROLE. SSL O PostgreSQL tem suporte nativo para conexões do tipo SSL que criptografa comunicações cliente / servidor. Contudo, necessita que o OpenSSL seja instalado nos sistemas cliente e servidor. Vejamos os principais parâmetros: • SSL: ativa as conexões SSL, cujo padrão é OFF. • ssl_ca_file: define o nome do arquivo que contém a autoridade de certificação do servidor SSL, cujos caminhos relativos são de acordo com o diretório dos dados. • ssl_cert_file: define o nome do arquivo que contém o certificado do servidor SSL, cujos caminhos são relativos ao diretório de dados. • ssl_crl_file: define o nome do arquivo que contém a lista de revogação de certificado do servidor SSL. Recursos de consumo O PostgreSQL também utiliza vários recursos do sistema operacional, especialmente quando está ativo ou ao iniciar. Com isso, por meio do PostgreSQL, podemos administrar memória, disco, recursos do kernel, atraso de vácuo baseado em custo etc. Vejamos os principais parâmetros: • shared_buffers: refere-se à quantidade de memória que o servidor utiliza para buffers de memória compartilhada, cujo valor mínimo é de 128 kilobytes. 40 • huge_pages: controla se as páginas grandes são solicitadas para a área de memória principal compartilhada. • temp_buffers: determina o número máximo de buffers temporários por cada sessão de banco de dados. • max_prepared_transactions: define o número máximo de transações que podem estar no estado “preparado” simultaneamente, cujo padrão é 0. • work_mem: a quantidade de memória a ser usada por operações internas de classificação e tabelas de hash antes de gravar em arquivos de disco temporários, cujo valor padrão é 4 MB. • maintenance_work_mem: determina a quantidade máxima de memória a ser utilizada pelas operações de manutenção, como VACUUM, CREATE INDEX e ALTER TABLE ADD FOREIGN KEY, cuja quantidade máxima padrão é de 64 MB. • autovacuum_work_mem: especifica a quantidade máxima de memória a ser usada por cada processo de trabalho autovacuum, cujo padrão é -1. • temp_file_limit: especifica a quantidade máxima de espaço em disco que um processo pode usar para arquivos temporários. Apenas superusuários podem alterar essa configuração. Atraso de vácuo baseado em custo No momento da execução dos comandos VACUUM (recupera o armazenamento ocupado por duplas mortas, isto é, coleta de lixo) e ANALYZE (coleta estatísticas sobre um banco de dados), o sistema mantém um contador interno que tem o controle do custo estimado das várias operações de I/O (entrada e saída) que são realizadas. 41 • vacuum_cost_delay: período de tempo, em milissegundos, que o processo ficará suspenso quando o limite de custo for excedido, cujo valor padrão é 0. • vacuum_cost_page_miss: custo estimado para limpar um buffer que deve ser lido do disco, cujo valor padrão é 10. • vacuum_cost_page_dirty: custo estimado cobrado quando o vácuo modifica um bloco que estava limpo anteriormente, cujo valor padrão é 20. Relatório e registro de erros O PostgreSQL suporta vários métodos para gerar relatório e registro de erros, coletando mensagens de log, por exemplo, e redirecionando para arquivos especificando o diretório de dados etc. Vejamosos principais: • log_destination: por padrão, esse parâmetro registra apenas erros stderr. Contudo, é possível configurar no arquivo postgresql.conf ou a partir da linha de comando do servidor. • logging_collector: na própria documentação do PostgreSQL afirma-se que essa abordagem é mais útil do que registrar no syslog, pois alguns tipos de mensagens podem ficar ocultas na saída do syslog. Este parâmetro ativa o coletor de log, que é um processo em segundo plano que captura mensagens de log enviadas para stderr, e as redireciona para arquivos de log. • log_directory: este parâmetro determina o diretório no qual os arquivos de log serão criados, e pode ser especificado com um caminho absoluto ou relativo dos dados. • log_filename: define os nomes dos arquivos de log criados. Caso a saída em formato .csv estiver habilitada em log_destination, então será anexado ao nome do arquivo de log com carimbo de data e hora para criar o nome do arquivo no formato de saída .csv. 42 • log_min_messages: controla quais níveis de mensagens são gravados no log do servidor, cujo padrão é WARNING. Quanto mais avançado for o nível, menos mensagens serão enviadas para o log. Interrupção do PostgreSQL Para interromper o PostgreSQL, utiliza-se o comando kill do Linux. Entretanto, requer o número do PID (ID do processo em execução) principal do PostgreSQL. O comando kill envia três tipos de notificações (sinais) para o serviço do PostgreSQL: • TERM (modo smart shutdown): o banco aguardará todas as conexões existentes finalizarem suas transações, mas não aceitará novas. kill -TERM 1880 • INT (modo fast shutdown): além de não aceitar novas conexões, envia um sinal TERM para que todas as conexões existentes interrompam suas transações e fechem. Contudo, este sinal também aguardará as conexões terminarem para parar o banco. kill -INT 1880 • QUIT (modo immediate shutdown), envia um sinal QUIT para todas as conexões e, assim, são encerradas e fechadas imediatamente. Caso o banco encerre com o sinal QUIT, ao inicializar, entrará em recovery para desfazer as ações que ficaram incompletas. kill -QUIT 1880 Para obter o PID do processo principal, você pode utilizar o comando ps. Vejamos as duas alternativas: 43 Primeira alternativa: ps -ef f | grep postgres Uma alternativa é por meio do arquivo postmaster.pid com o seguinte comando: Cat /db/data/postmaster.pid Também, há a opção de parar o servidor sem a necessidade do número do PID, utilizando o pg_ctl com o seguinte comando: Pg_ctl stop -mf Caso queira somente reiniciar, então o comando será: Pg_ctl restart Já para os casos em que há alteração de parâmetros do postgre. conf, o ideal é utilizar o comando para recarregar os parâmetros: reload. Vejamos: Pg_ctl reload SAIBA MAIS: Ficou curioso para conhecer mais parâmetros do postgresql. conf e quer se aprofundar neste tema? Por meio da documentação do PostgreSQL, você pode acessar todos os parâmetros e suas devidas descrições, por meio do link https://www.postgresql.org/docs/12/runtime.html (Acesso em 20 ago. 2020). http://https://www.postgresql.org/docs/12/runtime.html 44 RESUMINDO: Chegamos ao fim do nosso capítulo. Gostou do que mostramos? Agora, vamos recapitular tudo. Nós falamos sobre a inicialização do PostgreSQL e como armazenar as saídas stdout e stderr do servidor em um arquivo de log por meio do utilitário pg_ctl. Mostramos os principais parâmetros variáveis do arquivo postgre.conf e aprendemos a interromper o servidor de várias formas: com o número do PID por meio do comando kill e usando estratégias smart e fast em que o servidor aguarda as conexões serem encerradas para parar. Vimos, também, a estratégia immediate em que as conexões são encerradas e fechadas imediatamente. Ainda, apresentamos a alternativa por meio do utilitário pg_ctl. Por fim, vimos como reiniciar o servidor para o caso de atualização de parâmetros utilizando o reload. 45 Carga de dados no PostgreSQL INTRODUÇÃO: Agora que ocê já sabe como parar e reiniciar o servidor PostgreSQL, vamos discutir sobre carga de dados no PostgreSQL, que é o nosso próximo passo para tornar o banco de dados mais eficiente e com melhor performance de carga. Sendo assim, ao término deste capítulo, você saberá realizar transações no banco de dados por meio das palavras-chave BEGIN, COMMIT, ROLLBACK e SAVEOPOINT. Também será capaz de carregar dados no PostgreSQL usando comando copy from, melhorando a performance da carga com a remoção de índices e aumento das variáveis de configuração, e analisando o resultado com o comando analyse. Você sabia que muitas empresas têm sistemas mais complexos e ambientes críticos em que há vários servidores funcionando simultaneamente, sem poderem parar? Pois é! Realizar um bom manuseio da carga de dados torna-se fundamental para atingir um cenário de sucesso, principalmente em grandes empresas. E então, motivado para desenvolver essa competência? Vamos lá!. Transações PostgreSQL Os modos de confirmação automática tratam cada comando SQL como se estivessem agrupados em uma única transação. Por padrão, os programas com SQL integrados não estão no modo de confirmação automática e, assim, por meio de palavras-chave dentro das transações (BEGIN, COMMIT, ROLLBACK e SAVEOPOINT), é possível definir o comportamento de confirmação automática da sessão de banco de dados atual e melhorar o desempenho do servidor. 46 DEFINIÇÃO: Uma transação é uma unidade lógica de trabalho que contém uma ou mais instruções SQL em que apresenta para todas as instruções somente duas condições: será bem-sucedido para todas, ou todas falharão. EXPLICANDO MELHOR: Caso ocorra alguma falha com uma inserção em algum ponto dentro de uma transação, é possível desfazer a inserção de todas as inserções das linhas anteriores até o ponto do início da transação. Dessa forma, há uma menor preocupação com a carga parcial dos dados e, se ocorrer alguma falha, não afetará o banco de dados. Vejamos as transações na prática: Inicialmente, para melhor compreensão, vamos nos conectar ao banco de dados que criamos anteriormente. Lembra-se da sua senha? A conexão segue o mesmo processo. O comando no terminal do SQL shell que instalamos anteriormente para listar os bancos de dados existentes no servidor PostgreSQL é \l. Veja na Figura 23. Figura 23 Figura 23 – Tabelas atuais 47 Fonte: Elaborado pela autora. NOTA: Como já estamos conectados ao banco postgres, não é necessário entrar, mas se fosse, o comando seria \c database_name;. Para iniciar um bloco de transações, é utilizada a palavra-chave BEGIN e, dessa forma, todas as instruções SQL posteriores ao BEGIN serão executadas dentro de uma única unidade de transação que só considerará o processo da transação como finalizado quando encontrar as palavras-chave COMMIT ou ROLLBACK. Vejamos o uso do BEGIN da transação na Figura 24. Figura 24 – BEGIN da transação Fonte: Elaborado pela autora. Já a palavra-chave COMMIT salva as alterações no banco de dados. Para compreender melhor, vamos criar uma tabela e uma linha no banco de dados, permitindo acesso para outros usuários autorizados que se 48 conectarem ao banco por meio de outra sessão ou terminal. Vejamos o procedimento na Figura 25. Figura 25 – Uso do COMMIT da transação Fonte: Elaborado pela autora. Notou algo de diferente no comando? Você percebeu que utilizamos o end transaction? Pois é! Propositalmente, inserimos a palavra-chave end transaction. Perceba que realizou com sucesso, pois COMMIT e END TRANSACTION desempenham o mesmo papel, isto é, são iguais. E agora? Você é daquelas pessoas que só acreditam vendo? Pois bem! Para verificar e validar a criação da tabela, pode abrir um terminal SQL Shell (psql) em paralelo. Para isso, basta se conectar ao postgres novamente e digitar o comando \d, que lista as tabelas existentes no banco. Veja na Figura26 a tabela chamada teste que criamos no exemplo anterior. Figura 26 – Tabela teste criada no banco de dados Fonte: Elaborado pela autora. E se algo ocorreu errado? Basta utilizar o ROLLBACK para isso. Legal, não é mesmo? O ROLLBACK faz uma operação de reversão no banco de dados, deixando-o no estado conforme a etapa anterior. Sendo assim, podemos dizer que esse comando mantém a integridade dos dados, ou seja, pode restaurar os dados mesmo após execuções incorretas. Exemplo: Vamos ver um exemplo: deletaremos a tabela teste e utilizaremos o comando ROLLBACK para verificar se a tabela ainda consta no banco de dados. Vejamos o procedimento do comando para deletar na Figura 27. Figura 27 – Remoção da tabela criada Fonte: Elaborado pela autora. 49 Agora, com o comando \d (lembra-se dele e para que serve?), vamos observar se ainda há a tabela teste no banco. Vejamos na Figura 28 a tela de confirmação da tabela removida. Figura 28 – Tela de confirmação da tabela removida Fonte: Elaborado pela autora. Após confirmada a remoção da tabela, vamos utilizar o comando ROLLBACK (ver Figura 29) e observar que a tabela foi restaurada (ver Figura 30). Figura 29 – Comando ROLLBACK Fonte: Elaborado pela autora. Figura 30 – Tela de confirmação da restauração da tabela Fonte: Elaborado pela autora. Sendo assim, podemos perceber que a tabela foi retornada, mantendo a integridade dos dados, uma vez que tenha sido removida e voltado ao seu estado atual após o uso do comando ROLLBACK. Contudo, também existe a possibilidade de salvar um ponto de restauração por meio do comando SAVEPOINT, fornecendo a capacidade de reverter a transação até um determinado ponto, sem reverter a transação total. Passo a passo: Vamos realizar um passo a passo para melhor compreensão: 1. Criar uma tabela e inserir uma linha. Para isso, teremos que iniciar o comando BEGIN. Não esqueça! Vejamos na Figura 31. Figura 31 – Criação da tabela e inserção da linha Fonte: Elaborado pela autora. 50 2. Criar um ponto de restauração com o SAVEPOINT. Veja na Figura 32 que foi criado o SAVEPOINT. Após esse passo, você vai perceber que qualquer operação que fizermos e para a qual chamarmos o ROLLBACK, as operações serão desfeitas até este ponto. Figura 32 – Criação da tabela e inserção da linha Fonte: Elaborado pela autora. 3. Inserir mais duas linhas na tabela criada. Perceba (ver Figura 33) que houve mais duas inserções na tabela. Ao listar o conteúdo da tabela por meio do comando select * from minha_tabela;, observamos os elementos 1, 3 e 2 inseridos. Figura 33 – Criação da tabela e inserção da linha 51 Fonte: Elaborado pela autora. 4. Disparar o comando ROLLBACK até o ponto de restauração SAVEPOINT (ver Figura 34). Figura 34 – ROLLBACK até o ponto de restauração Fonte: Elaborado pela autora. 5. Visualizar a tabela após o ROLLBACK (Figura 35). Sendo assim, ao selecionarmos a tabela novamente, podemos notar que ela apresenta somente a linha inserida até o SAVEPOINT. Figura 35 – ROLLBACK até o ponto de restauração Fonte: Elaborado pela autora. 6. Finalizar com o COMMIT. Você deve notar que o bloco de transações ainda está ativo e que, para finalizar, precisamos disparar o COMMIT ou um segundo ROLLBACK. Figura 36 – ROLLBACK até o ponto de restauração Fonte: Elaborado pela autora. Uso do COPY FROM e ANALYSE O comando COPY FROM realiza uma cópia dos dados de um arquivo para uma tabela. Caso ela já contenha dados, os novos dados copiados serão adicionados aos já existentes. Ainda, existem alguns parâmetros que devem ser considerados na especificação do comando COPY FROM, pois, por exemplo, quando são utilizados o STDIN e o STDOUT, os dados são transmitidos por meio da conexão entre o cliente e o servidor. 52 Os parâmetros são estes: nome da tabela, lista de colunas a serem copiadas, nome do caminho absoluto do arquivo, especificação da entrada e da saída do aplicativo cliente, armazenamento no formato binário, identificador do objeto (OID), CSV (modo valor separado por vírgula), Force Quote (força a utilização do demarcador em todos os valores diferentes de NULL) e Force not null (processa cada coluna especificada como se estivesse demarcada e, portanto, não sendo um valor NULL). Exemplo: Vejamos um exemplo do uso do COPY e do COPY FROM, em que iremos realizar uma cópia de uma tabela (estados) para o cliente, utilizando: no primeiro comando o delimitador de campo é a barra vertical, e no segundo, o COPY FROM para copiar os dados do arquivo dados_ estados para a tabela estados. COPY estados TO STDOUT WITH DELIMITER ‘|’; COPY estados FROM ‘user1/proj/sql/dados_estados’; Dessa forma, sempre que alterar os dados da tabela, isto é, após a alteração da distribuição dos dados no banco de dados, recomenda-se executar o comando ANALYSE (ou VACUUM ANALYSE). Tal comando visa garantir que o planejador tenha estatísticas atualizadas sobre a tabela, pois, com estatísticas obsoletas, é possível que tenha um desempenho fraco. Vejamos exemplos com os comandos: 1. Comando VACUUM simples: libera espaço para reutilização. VACUUM minha_tabela; 2. Comando VACUUM completo: bloqueia a tabela do banco de dados e recupera mais espaço do que o VACUUM simples. Note que há dois tipos de comando, dependendo da versão do postgres instalada. /* Para Postgres nas versões posteriores ao 9.0: */ VACUUM(FULL) minha_tabela; 53 /* Para Postgres nas versões anteriores ao 9.0: */ VACUUM FULL 3. Full VACUUM and ANALYZE: executa um Full VACUUM e reúne novas estatísticas em caminhos de execução de consulta usando ANALYZE. Note que há dois tipos de comando, dependendo da versão do postgres instalada. /* Para Postgres nas versões posteriores ao 9.0: */ VACUUM (FULL, ANALYZE) minha_tabela; /* Para Postgres nas versões anteriores ao 9.0: */ VACUUM FULL ANALYZE minha_tabela; Podemos utilizar somente o comando ANALYSE, em que há a opção de ter ou não o nome da tabela. Sem o nome de uma tabela especificada, o comando será executado apenas nas disponíveis no schema atual ao qual o usuário tem acesso. /* nome da tabela opcional */ ANALYZE VERBOSE minha_tabela; Já para os casos de reconstruir um ou mais índices do banco de dados, substituindo a versão anterior do índice, podemos utilizar o comando REINDEX, que pode ser utilizado em vários cenários. De acordo com a documentação do PostgreSQL, há outras funcionalidades do REINDEX, por exemplo, reduzir o consumo de espaço do índice ou reconstruir uma falha em um índice inválido. NOTA: Para construir o índice sem interferir na produção, você deve descartar o índice e emitir novamente o comando CREATE INDEX CONCURRENTLY. 54 Vejamos alguns exemplos. Vale ressaltar que qualquer um desses comandos podem ser forçados adicionando a palavra-chave FORCE após o comando: 1. Recriar um índice específico: REINDEX INDEX meuindex 2. Recriar todos os índices de uma tabela: REINDEX TABLE minha_tabela 3. Recriar todos os índices de um schema público: REINDEX SCHEMA public 4. Recriar todos os índices do banco de dados postgres: REINDEX DATABASE postgres 5. Recriar todos os índices nos catálogos do sistema no banco de dados postgres:REINDEX SYSTEM postgres SAIBA MAIS: Ficou curioso e quer se aprofundar neste tema? Leia o artigo sobre o maintenance_work_mem. Nele, você compreenderá como é controlada a quantidade de memória que o sistema irá alocar. Acesse o link https://bit. ly/34cbmcK (Acesso em 22 ago. 2020). http://https://bit.ly/34cbmcK http://https://bit.ly/34cbmcK 55 RESUMINDO: Chegamos ao fim do nosso capítulo. Gostou do que mostramos? Agora, vamos recapitular tudo. Nós falamos sobre como realizar transações no banco de dados por meio das palavras-chave BEGIN, COMMIT, ROLLBACK e SAVEOPOINT. Agora sabemos que é possível criar um ponto de restauração e que, caso ocorra alguma falha, podemos voltar ao estado anterior e garantira integridade dos dados. Também vimos como utilizar os comandos COPY FROM, como melhorar a performance da carga com a remoção de índices e com o aumento das variáveis de configuração, reconstruindo um ou mais índices do banco de dados, e substituindo a versão anterior do índice. Por fim, vimos como analisar o resultado com o comando ANALYSE ou VACUUM. REFERÊNCIAS CARVALHO, V. PostgreSQL: Banco de dados para aplicações web modernas. Editora Casa do Código, 2017. HASS, R. How Much maintenance_work_mem Do I Need? Robert Hass, 2019. Disponível em: http://rhaas.blogspot.com/2019/01/how-much- maintenanceworkmem-do-i-need.html. Acesso em: 22 ago. 2020. PostgreSQL. PostgreSQL: The World’s Most Advanced Open Source Relational Database. Disponível em: https://www.postgresql.org. Acesso em: 25 ago. 2020. 56 THE PostgreSQL Global Development Group . Documentação do PostgreSQL. 2005. Disponível em: http://pgdocptbr.sourceforge.net/. Acesso em: 18 ago. 2020. 57 58 59 60 61 62 63 64 65 66 67 68 69 70 Administração do SGBD PostgreSQL Camila Freitas Sarmento Banco de dados e índices O banco de dados Conectando ao usuário de conexão do banco de dados no Windows Conectando ao usuário de conexão do banco de dados no Linux O pgAdmin Índices Schemas, tablespaces e gerenciamento de usuários Schemas Tablespaces Gerenciamento de usuários Roles Privilégios Inicialização e interrupção do PostgreSQL Inicialização do PostgreSQL Arquivo postgresql.conf Localização de arquivos Conexões e autenticação SSL Recursos de consumo Atraso de vácuo baseado em custo Relatório e registro de erros Interrupção do PostgreSQL Carga de dados no PostgreSQL Transações PostgreSQL Uso do COPY FROM e ANALYSE
Compartilhar