Este artigo descreve o MySQL, uma ferramenta eficaz para desenvolver comércio eletrônico e outros sites complexos e dinâmicos usando bancos de dados de terceiros. MySQL é um servidor SQL rápido, multithread e completo. Além de descrever a arquitetura básica do sistema MySQL, este artigo também fornece exemplos simples escritos em Tcl e C++ para ajudá-lo a desenvolver aplicações Web suportadas por banco de dados. Este artigo descreve o MySQL, uma ferramenta eficaz para desenvolver comércio eletrônico e outros sites complexos e dinâmicos usando bancos de dados de terceiros. MySQL é um servidor SQL rápido, multithread e completo. Além de descrever a arquitetura básica do sistema MySQL, este artigo também fornece exemplos simples escritos em Tcl e C++ para ajudá-lo a desenvolver aplicações Web suportadas por banco de dados.
Um aplicativo que precisa armazenar ou acessar grandes quantidades de informações pode se beneficiar muito com o uso de um produto de banco de dados de terceiros. Isto é especialmente verdadeiro quando o acesso à informação deve ocorrer em múltiplas instâncias do programa. As aplicações baseadas na Web (incluindo o comércio electrónico) são bons exemplos disso.
Por que usar um banco de dados independente?
Os servidores Web devem ter uma maneira de seus scripts de processamento armazenarem informações sobre seu estado para acesso posterior. Embora seja possível usar métodos mais primitivos - como despejar em um arquivo de texto ou desenvolver um minibanco de dados caseiro - apenas um aplicativo de banco de dados completo pode fornecer todos os serviços exigidos por um aplicativo Web mais complexo. Não há muitos benefícios em escrever um mecanismo de banco de dados personalizado específico para um aplicativo, pois existem alguns pacotes de software disponíveis gratuitamente para essa finalidade. Além disso, o uso de um banco de dados de terceiros também elimina a necessidade de os desenvolvedores web se dedicarem à tarefa de desenvolver e manter um banco de dados.
Banco de dados MySQL
A integração de bancos de dados em aplicativos Linux pode ser bastante fácil através do uso de linguagens de script e linguagens de sistema compiladas, como C. O banco de dados MySQL disponível gratuitamente (distribuído sob a licença pública GNU) fornece um conjunto sofisticado de funções SQL e é fácil de integrar em aplicativos. MySQL é rápido, multithread e suporta padrões SQL ANSI e ODBC. Juntamente com software de terceiros, o MySQL oferece suporte a tabelas seguras para transações para aplicativos de processamento de transações.
Nota: O que é processamento de transações?
Uma transação é uma série de alterações em um banco de dados que precisam ser executadas atomicamente. Todos eles devem ser executados ou nenhum deles deve ser executado. Por exemplo, todas as alterações necessárias no banco de dados ao vender um produto na Web formam uma única transação.
O banco de dados precisa subtrair o saldo da conta do cliente e o estoque do produto, caso contrário ele falhará e nenhuma operação será executada.
Uma falha no servidor por qualquer motivo não deve fazer com que as transações sejam parcialmente executadas. Por exemplo, superfaturamento, produtos não entregues ou estoque impreciso podem ser o resultado de transações parcialmente concluídas.
Um banco de dados que suporta processamento de transações pode encapsular um conjunto de códigos de banco de dados em uma transação. Qualquer falha durante a execução da transação fará com que o banco de dados volte ao estado anterior ao início da transação.
Isto é conseguido mantendo um log de todas as operações do banco de dados, bem como uma cópia de sua tabela de estados original, permitindo operações de rollback na próxima vez que o servidor for reiniciado após uma falha. Essa sobrecarga de tempo e espaço é uma compensação necessária para um sistema de banco de dados seguro para transações.
Um único servidor MySQL controla uma série de bancos de dados, todos acessados de maneira semelhante através do servidor. Cada banco de dados é na verdade um conjunto de qualquer número de tabelas, semelhante em conceito aos usuários de outros bancos de dados SQL. Cada tabela consiste em colunas de dados digitadas. Os dados podem ser inteiros, valores reais, strings ou outros tipos, incluindo fluxos binários brutos. Cada linha da tabela é um registro armazenado no banco de dados.
MySQL é projetado e estruturado como um cliente/servidor. O servidor mysqld pode ser executado em qualquer máquina que possa ser acessada pela Internet (de preferência na mesma máquina do servidor Web ou o mais próximo possível para garantir tempos de resposta razoáveis). O cliente MySQL usa solicitações para entrar em contato com o servidor MySQL para modificar ou consultar o banco de dados de propriedade do servidor. Em um aplicativo Web habilitado para banco de dados, o cliente do banco de dados é o servidor Web ou um script CGI gerado pelo servidor Web. Esses clientes podem ser escritos em uma linguagem de script de alto nível ou em uma linguagem de sistema de baixo nível, desde que exista uma API de banco de dados para essa linguagem. No Linux, a maioria das linguagens de script são implementadas em C e, como existe a API MySQL C, deve ser fácil adicionar suporte MySQL a qualquer linguagem ou ferramenta de script existente. A maioria das linguagens de script já concluiu esta etapa.
API MySQL
A API MySQL está disponível em uma variedade de linguagens, incluindo quase todas as linguagens realmente usadas para escrever back-ends de sites. Usando essas APIs podemos construir um cliente MySQL controlado por um servidor web.
A API (para acesso ao banco de dados) funciona em modo baseado em conexão. A primeira coisa que o cliente deve fazer é abrir uma conexão com o servidor MySQL. Isso inclui autenticar adequadamente a conexão usando um nome de usuário e uma senha conhecidos pelo servidor. Após a conexão ser estabelecida, o servidor seleciona um banco de dados específico para usar. Uma vez determinada a inicialização, o aplicativo cliente (no nosso caso, o script CGI do lado do servidor) fica livre para interagir com o banco de dados de duas maneiras: ele pode executar comandos SQL regulares, incluindo adicionar e eliminar tabelas, e adicionar registros a neles; você também pode executar consultas no banco de dados que retorna resultados. A consulta gera um conjunto de registros que correspondem à consulta e o cliente pode então acessar os registros, um de cada vez, até que todos os registros tenham sido visualizados ou o cliente cancele a recuperação de registros pendentes. Assim que o script terminar de trabalhar com o banco de dados, a conexão com o servidor será encerrada.
Para construir um site que integre acesso ao banco de dados, você precisa escrever scripts CGI para gerar resultados dinâmicos com base no estado do banco de dados. Os servidores Web iniciam scripts CGI e, em seguida, geram HTML formatado apropriadamente em seu fluxo de saída padrão. O servidor web captura o HTML e o envia de volta ao cliente como se a solicitação fosse para uma página HTML estática. No processo de geração de HTML, os scripts podem modificar o banco de dados ou podem consultar e incorporar os resultados em sua saída.
Como exemplo para explicar brevemente o processo acima, o código a seguir (escrito em C e Tcl) consulta um banco de dados contendo uma lista de produtos à venda por uma empresa. Isso de forma alguma usa todos os recursos da API MySQL em ambas as linguagens, mas fornece um exemplo rápido e facilmente extensível que pode executar qualquer comando SQL no conteúdo do banco de dados. Neste exemplo, o script exibe todos os produtos abaixo de um preço específico. Na prática, o usuário pode inserir o preço em um navegador da Web e depois enviá-lo ao servidor. Deixamos de fora os detalhes da leitura de variáveis de ambiente para determinar os valores do formulário HTML porque não é diferente de executar em um script CGI que não oferece suporte a um banco de dados. Para maior clareza, assumimos que determinados parâmetros (como o preço a ser consultado) são definidos antecipadamente.
O código a seguir é implementado em Tcl usando a Tcl Generic Database Interface disponível gratuitamente. A vantagem dessa interface é que o Tcl é interpretado e pode desenvolver e modificar rapidamente o código.
Exemplo Tcl
#Este código imprime todos os produtos do banco de dados
# que estão abaixo de um preço especificado (presumivelmente determinado
# previamente e armazenado na variável targetPrice)
# A saída está em formato de tabela HTML, apropriado para saída CGI
#load a biblioteca de objetos compartilhados SQL, o interpretador Tcl também poderia.
#foram compilados com a biblioteca, tornando esta linha desnecessária
carregar /home/aroetter/tcl-sql/sql.so
#estes estão bem definidos de antemão, ou podem
#ser passado para o script
defina DBNAME "clientWebSite";
definir TBLNAME "produtos";
definir DBHOST “backend.company.com”
setDBUSER "mysqluser"
definir DBPASSWD "abigsecret"
definir targetPrice 200;
#conectar ao banco de dados
definir identificador [sql connect $DBHOST $DBUSER $DBPASSWD]
sql selectdb $handle $DBNAME ;# obtém banco de dados de teste
#executa uma consulta usando o código SQL especificado
consulta sql $handle "selecione * de $TBLNAME onde preço <= $targetPrice"
#imprime o cabeçalho da tabela HTML
coloca "<table border=4>"
coloca "<th>ID do produto <th width=200>Descrição <th>Preço ($)"
#output linhas da tabela - cada busca recupera um resultado
#da consulta SQL
while {[definir linha [sql fetchrow $handle]]!= ""} {
definir prodid [lindex $ linha 0]
definir descrição [lindex $ linha 1]
definir preço [lindex $ linha 2]
coloca "<tr><td>$prodid <td align=center>$descript <td>$price"
}
coloca "</table>"
#empty o buffer de resultados da consulta - já deve estar vazio neste caso
sql endquery $handle
#feche a conexão db - na prática essa mesma conexão
#é usado para múltiplas consultas
sql desconectar $handle
O código abaixo é o script equivalente escrito em C++ usando a API oficial do MySQL C++ MySQL++. A vantagem desta versão é que ela é compilada e, portanto, mais rápida que as linguagens interpretadas. O código do banco de dados frequentemente usado em um site específico deve ser escrito em C ou C++ e então acessado por scripts ou diretamente do servidor web para melhorar o tempo de execução geral.
Exemplo C++
#incluir
#incluir
#incluir
const char *DBNAME = "clientWebSite";
const char *DBTABLE = "produtos";
const char *DBHOST = "backend.empresa.com";
const char *DBUSER = "mysqluser";
const char *DBPASSWD = "abigsecret":
int principal() {
tentar {
//abre a conexão com o banco de dados e consulta
Conexão con(DBNAME, DBHOST, DBUSER, DBPASSWD);
Consulta consulta = con.query();
//escreve código SQL válido no objeto de consulta
consulta << "selecione * de " << DBTABLE;
//executa a consulta e armazena os resultados
Resultado res = query.store();
//escreve o cabeçalho da tabela html
cout << "<borda da tabela=4>n";
cout << "<th>ID do produto <th width=200>Descrição"
<< "<th>Preço ($)" << endl;
Resultado::iterador curResult;
Linha linha;
//itere sobre cada resultado e coloque-o em uma tabela html
for (curResult = res.begin(); curResult != res.end(); curResult++) {
linha = *curResult;
cout << "<tr><td align=center>" << linha[0]
<< "<td>" << linha[1]
<< "<td>" << linha[2] << endl;
}
cout << "</table>" << endl;
} catch (BadQuery é) {
// trata uma consulta incorreta (geralmente causada por um erro de sintaxe sql)
cerr << "Erro: " << er.error << endl;
retornar -1;
} catch (BadConversioner) {
//lida também com erros de conversão fora do banco de dados
cerr << "Erro: Não é possível converter "" << er.data << "" para ""
<< er.type_name << ""." << endl;
retornar -1;
}
retornar 0;
}
segurança
A criação de aplicativos baseados na Web na Web apresenta alguns problemas que os desenvolvedores precisam considerar. Todas as questões relacionadas aos programas CGI no servidor Web, como permissões de processamento do servidor Web e verificações de entrada no lado do script, ainda precisam ser consideradas.
Além disso, também é necessário manter a segurança do sistema de banco de dados. Isso envolve proteger o sistema de permissões do servidor de banco de dados e tornar seguras as conexões dos clientes de banco de dados com o servidor.
O MySQL fornece um sistema de segurança detalhado que algumas pessoas descrevem como “avançado, mas não padrão”. O MySQL permite o acesso do cliente com base no nome de usuário, host do cliente e banco de dados a ser acessado. Para criar um sistema seguro, faça com que todos os usuários usem senhas fortes e não lhes dê nenhum acesso que não sejam absolutamente necessários. Isso inclui privilégios aparentemente inócuos, como privilégios de manipulação que permitem ao usuário visualizar todos os processos em execução, incluindo aqueles que alteram as senhas de outros usuários. A melhor abordagem é executar o próprio processo do servidor como um usuário Unix sem privilégios, para que, se um banco de dados for comprometido, não derrube todo o sistema. Isso é semelhante a executar o httpd como usuário ninguém em vez de root. As tabelas que descrevem o acesso ao sistema são armazenadas como bancos de dados MySQL separados e podem ser atualizadas pelo usuário root do MySQL. Observe que o servidor MySQL concede privilégios com base em nomes de usuário MySQL, que são diferentes dos nomes de usuário Unix. No entanto, existe um nome de usuário root do MySQL, que possui permissões completas no banco de dados. Depois que o servidor determina quem são os clientes conectados e ao que eles estão tentando se conectar, o acesso é controlado com base em um determinado conjunto de permissões. Para evitar que os nomes de host na tabela de acesso sejam falsificados pelo DNS, você pode inserir os endereços IP de todos os hosts ou solicitar ao servidor que resolva os endereços IP de volta aos nomes de host originais para tornar mais difícil para outros interceptarem solicitações e respostas de DNS. .
Além das tabelas de acesso ao servidor, a comunicação com o servidor também deve ser segura. Ao efetuar login no servidor a partir do cliente, a senha não é enviada em texto simples, no entanto, todos os comandos SQL subsequentes serão enviados em texto simples; Para maior segurança, use ssh para configurar o encaminhamento de porta. Ele criptografa toda a comunicação entre o servidor e o cliente, evitando que alguém a observe em trânsito. Os dados do cliente são enviados para a porta da máquina local do cliente onde o servidor ssh local está escutando. Ele é utilizado pelo servidor ssh local, criptografado e enviado ao servidor ssh remoto, que o descriptografa e encaminha para a porta do servidor MySQL.
Na prática, a abordagem mais segura é executar o servidor de banco de dados na mesma máquina que o servidor web e deixar os scripts CGI gerados pelo servidor web se comunicarem com o servidor MySQL através de soquetes UNIX (nativos). Esta configuração permite que o administrador do banco de dados desative todas as conexões remotas com o servidor MySQL. Se os servidores web e de banco de dados precisarem estar em máquinas diferentes, criptografe todas as comunicações entre eles ou conecte as duas máquinas por meio de suas próprias redes dedicadas e fisicamente isoladas. Crie apenas uma conta de usuário (diferente do usuário root) usada pelo servidor web para efetuar login no servidor de banco de dados.
Sites baseados em banco de dados são ferramentas poderosas que permitem aos desenvolvedores criar sites dinâmicos que fornecem informações atualizadas e permitem que alterações iniciadas pelo cliente persistam em várias sessões. O uso de bancos de dados back-end é essencial para gerenciar usuários de comércio eletrônico e outras aplicações. Usando software disponível gratuitamente, é possível construir um site baseado em banco de dados que integre com segurança a conectividade do banco de dados à arquitetura CGI existente do site.