Вы находитесь на странице: 1из 142

Programadeformacin:BASEDEDATOSMySQL

OBJETIVOS DEL CURSO

OBJETIVO GENERAL

Capacitar al participante para utilizar el manejador de base de datos MySql y su entorno de administracin.

OBJETIVOS ESPECFICOS

Al finalizar el curso de MySQL el participante estar en capacidad de:

Identificar la historia, caractersticas y modalidad de trabajo de MySQL como servidor de bases de datos Describir las instrucciones bsicas para la administracin de bases de datos en de MySQL. Emplear las instrucciones necesarias para procesar la informacin y los registros de las tablas en una base de datos de MySQL Utilizar la metodologa de trabajo de transacciones en MySQL Manipular mtodos de acceso remoto a MySQL Emplear algunas tcnicas para mejorar el rendimiento de un servidor MySQL

Pg.1de142

Programadeformacin:BASEDEDATOSMySQL
Construir los pasos necesarios para realizar migraciones a MySQL desde otras plataformas de manejo de datos Ejecutar algunos clientes grficos alternativos para la administracin de un servidor MySQL

Pg.2de142

Programadeformacin:BASEDEDATOSMySQL

CONTENIDO PROGRAMTICO
Unidad 1: Introduccin MySQL Unidad 2: Administracin bsica de bases de datos MySQL. Unidad 3: Operaciones sobre tablas. Unidad 4: Transacciones. Unidad 5: Acceso remoto a MySQL. Unidad 6: Administracin avanzada de MySQL. Unidad 7: Migracin a MySQL.

Pg.3de142

Programadeformacin:BASEDEDATOSMySQL

UNIDAD 1: Introduccin

Objetivo de la Unidad: Utilizar MySQL como servidor de bases de datos, instalndolo y activando su funcionamiento.

Temas: Definicin MySQL Historia Descripcin bsica Instalacin y actualizaciones Puesta en marcha de un servidor MySQL

Definicin de MySQL

El gestor de bases de datos conocido MySQL es un sistema de gestin de bases de datos relacional, licenciado bajo la GPL de la GNU. Su diseo multihilo permite soportar una gran carga de forma muy eficiente. La compaa sueca MySQL AB es la creadora de MySQL, la cual mantiene el copyright del cdigo fuente del servidor SQL, as como tambin de la marca.

Pg.4de142

Programadeformacin:BASEDEDATOSMySQL
MySQL es un software libre, pero MySQL AB distribuye tambin una versin comercial de MySQL, la cual slo se diferencia de la versin libre en el soporte tcnico que se ofrece, y la posibilidad de integrar este gestor a un software propietario, de lo contrario, se vulnerara la licencia GPL.

Este gestor de bases es considerado uno de los ms utilizados en todo el mundo del software libre, gracias a su gran rapidez y facilidad de uso. Esto se debe, en parte, a que existen infinidad de libreras y otras herramientas que permiten su uso a travs de gran cantidad de lenguajes de programacin, adems de su fcil instalacin y configuracin.

Historia

MySQL nace como un intento de conectar el gestor mSQL a las tablas propias de MySQL AB, utilizando sus propias rutinas a bajo nivel. Despus de llevar a cabo las pruebas iniciales, se vio que mSQL no era lo suficientemente flexible para lo que se necesitaba, por lo que se tuvo que desarrollar nuevas funciones. Esto dio como resultado una interfaz SQL a su base de datos, con una interfaz totalmente compatible a mSQL. No se sabe con certeza de donde proviene su nombre; se dice, por un lado, que sus libreras llevaron el prefijo 'my' durante los diez ltimos aos. Por otro lado, la hija de uno de los desarrolladores se llama My, pero no se sabe con exactitud cul de estas dos razones le dio su nombre a este conocido gestor de bases de datos.

Pg.5de142

Programadeformacin:BASEDEDATOSMySQL

Descripcin bsica

Las

caractersticas

presentadas

continuacin

son

implementadas

nicamente por MySQL: Aprovecha la potencia de sistemas multiprocesador, gracias a su

implementacin multihilo. Soporta gran cantidad de tipos de datos para las columnas. Dispone de API's en gran cantidad de lenguajes (C, C++, Java, PHP, etc.) Cuenta con una gran portabilidad entre sistemas. Soporta hasta 32 ndices por tabla. Gestin de usuarios y passwords, manteniendo un muy buen nivel de seguridad en los datos. Mltiples motores de almacenamiento (MyISAM, Merge, InnoDB, BDB, Memory/heap, MySQL Cluster, Federated, Archive, CSV, Blackhole y Example en 5.x), permitiendo al usuario escoger la que sea ms adecuada para cada tabla de la base de datos. Agrupacin de transacciones, reuniendo mltiples transacciones de varias conexiones para incrementar el nmero de transacciones por segundo.

Existen tres tipos de compilacin del servidor MySQL:

Pg.6de142

Programadeformacin:BASEDEDATOSMySQL
el tipo estndar: los binarios estndar de MySQL son los recomendados para la mayora de los usuarios, e incluyen el motor de almacenamiento InnoDB. Max (No se trata de MaxDB, que es una cooperacin con SAP): los binarios incluyen caractersticas adicionales que no han sido lo bastante probadas o que normalmente no son necesarias. MySQL-Debug: son binarios que han sido compilados con informacin de depuracin extra. No debe ser usada en sistemas en produccin porqu el cdigo de depuracin puede reducir el rendimiento.

Instalacin y actualizacin

Lo primero que se debe hacer es conseguir los paquetes necesarios en el sitio Web oficial de MySQL: http://www.mysql.com

El archivo se encuentra comprimido con el formato TAR.GZ e indica en su nombre la versin del MySQL que se ha descargado, por ejemplo: mysql3_22_22_tar.gz Para poder realizar todo el proceso de instalacin se debe tener acceso como root a la estacin Linux. Lo primero que se debe hacer es un directorio de instalacin, aunque lo normal sera que se creara en /usr/local, /urs/src, o bien en /opt. Para el caso que sirve de ejemplo se va a trabajar con /usr/local, aunque el proceso sera para los otros.

Pg.7de142

Programadeformacin:BASEDEDATOSMySQL
Luego, se descomprimen los paquetes en el directorio seleccionado para instalar:

cd /usr/local tar zxvf /root/instal/mysql-3.22.x.tar.gz Se crean enlaces sencillos a cdigo fuente

ln -s /usr/local/mysql-3.22.x /usr/local/mysql

Se compila e instala MySQL cd /usr/local/mysql ./configure --witout-debug --prefix=/usr/local/mysql make make install cp /usr/local/support-files/mysql.server /etc/rc.d/init.d/mysql chmod 755 /etc/rc.d/init.d/mysql

Se crea la bases del datos del sistema MySQL

/usr/local/mysql/bin/mysql_install_db

Pg.8de142

Programadeformacin:BASEDEDATOSMySQL

Se arranca el servidor MySQL

/etc/rc.d/init.d/mysql start/etc/rc.d/init.d/mysql start

Se asigna el password del administrador (root ) de MySQL

/usr/local/mysql/bin/mysqladmin -u root password "clave"

Puesta en marcha de un servidor MySQL

Primero se arranca MySQL:

./mysqld start

Mysql almacena en una tabla llamada mysql todo el sistema de permisos de acceso al servidor, a las bases de datos y sus tablas, que como todas se encontrar en el directorio /data, a menos que se especifique otro directorio, en caso de que no existan se ejecuta el comando:

/usr/local/mysql/bin/mysql_install_db Pg.9de142

Programadeformacin:BASEDEDATOSMySQL

Todos los permisos y restricciones a los datos de nuestras bases de datos se guardan en la base de datos mysql. La herramienta principal de MySQL es mysqladmin, la cual, como indica su nombre, es la encargada de la administracin.

El usuario root se crea por defecto por MySQL, se puede utilizar este usuario como administrador o crear otro, por ejemplo mysqladmi, con todos los permisos posibles habilitados. Como el usuario root se crea sin clave de acceso, lo primero que se debe hacer es asignarle una:

mysqladmin -u root password "miclave"

De ahora en adelante, para cualquier operacin que se realice como root, se debe especificar la clave. Hay que destacar que entre el modificador -p y la clave no debe haber espacios.

mysqladmin -u root -pmiclave

Ahora bien, Mysql se esta preparado para crear una base de datos

mysqladmin -u root -pmiclave create mibasededatos

Pg.10de142

Programadeformacin:BASEDEDATOSMySQL

Si se desea borrarla

mysqladmin -u root -pmiclave drop mibasededatos

La estructura de MySQL

En el directorio /bin se pueden encontrar ejemplos de script y SQL. En el directorio /share se encuentran los mensajes de error del servidor para los distintos idiomas. Los directorios /include y /lib contiene los archivos *.h y las libreras necesarias, en /bin se encuentran los archivos ejecutables, y en /data se encuentran, como subdirectorio, cada una de las bases de datos que se hayan creado.

MySQL crea un directorio con el nombre que le hemos asignado a la base de datos, para cada base de datos que se crea. Dentro de este directorio, por cada tabla que se defina como MySQL se mitabla.ISM, mitabla.frm crean tres archivos: mitabla.ISD,

El archivo con extensin ISD, contiene los datos de la tabla, el ISM contiene la informacin sobre las claves y otros datos que MySQL utiliza para buscar datos en el fichero ISD. Y el archivo frm contiene la estructura de la propia tabla.

Pg.11de142

Programadeformacin:BASEDEDATOSMySQL

Ya que las bases de datos de MySQL son simples archivos de un directorio, para realizar copias de seguridad, se pueden utilizar las herramientas de compresin que habitualmente se utilizan en el sistema, y luego copiarlo a otro lugar, o simplemente esto ltimo.

Seguridad

Como se mencion antes, Mysql guarda todo el sistema de permisos en una base de datos llamada mysql, la cul se componen de cinco tablas: host, user, db, tables_priv, colums_priv.

La tabla user contiene la informacin sobre los usuarios, desde que mquinas se puede acceder a nuestro servidor MySQL, su clave y de sus diferentes permisos. La tabla host ofrece informacin sobre que mquinas podrn tener acceso a nuestro sistema, as como a las bases de datos que tendrn acesso y sus diferentes permisos. Finalmente, las tablas db, tables_priv, columns_priv ofrecen un control individual sobre las bases de datos, las tablas y las columnas (campos).

Pg.12de142

Programadeformacin:BASEDEDATOSMySQL
CAMPO Host User Password Select_pri v Insert_pri v Update_pr iv Delete_pri v Create_pri v Drop_priv ','Y') Reload_pr iv Shutdown _priv Process_p riv File_priv ','Y') Pg.13de142 ','Y') enum('N N ','Y') enum('N N ','Y') enum('N N enum('N N ','Y') enum('N N ','Y') enum('N N ','Y') enum('N N ','Y') enum('N N ','Y') enum('N N TIPO char(60) char(16) char(16) enum('N N POR DEFECTO

Programadeformacin:BASEDEDATOSMySQL
CAMPO Grant_priv ','Y') Reference s_priv Index_priv ','Y') Alter_priv ','Y') Tabla 1.1 Tabla User enum('N N ','Y') enum('N N enum('N N TIPO enum('N POR DEFECTO N

CAMPO Host Db Select_pri v Insert_priv ','Y') ','Y')

TIPO char(60) char(32) enum('N enum('N

POR DEFECTO

N N

Pg.14de142

Programadeformacin:BASEDEDATOSMySQL
CAMPO Update_pr iv Delete_pri v Create_pri v Drop_priv ','Y') Grant_priv ','Y') Reference s_priv Index_priv ','Y') Alter_priv ','Y') Tabla 1.2 Tabla host enum('N N ','Y') enum('N N enum('N N enum('N N ','Y') enum('N N ','Y') enum('N N ','Y') enum('N N TIPO enum('N POR DEFECTO N

CAMPO Host

TIPO char(60)

POR DEFECTO

Pg.15de142

Programadeformacin:BASEDEDATOSMySQL
CAMPO Db User Select_pri v Insert_priv ','Y') Update_pr iv Delete_pri v Create_pri v Drop_priv ','Y') Reference s_priv Index_priv ','Y') Alter_priv ','Y') Tabla 1.3 Tabla db enum('N N ','Y') enum('N N enum('N N ','Y') enum('N N ','Y') enum('N N ','Y') enum('N N enum('N N ','Y') enum('N N TIPO char(32) char(16) enum('N N POR DEFECTO

Pg.16de142

Programadeformacin:BASEDEDATOSMySQL
A continuacin se describen los diferentes permisos:

Select_priv Insert_priv Update_pri v Delete_pri v Create_pri v Drop_priv Reload_pri v Shutdown_ priv Process_pr iv File_priv

Utiliza la sentencia SELECT Utiliza la sentencia INSERT Utiliza la sentencia UPDATE Utiliza la sentencia DELETE Utiliza la sentencia CREATE o crear bases de datos Utiliza la sentencia DROP o eliminar bases de datos Recarga el sistema mediante mysqladmin reload Permite parar el servidor mediante mysqladminPermite parar el servidor mediante mysqladmin shutdown Manejar procesos del servidor Permite DATA INFILE leer y escribir ficheros usando

comando como SELECT INTO OUTFILE y LOAD Grant_priv Otorga permisos a otros usuarios

Pg.17de142

Programadeformacin:BASEDEDATOSMySQL
Select_priv Index_priv Alter_priv Utiliza la sentencia SELECT Crear o borrar ndices Utiliza la sentencia ALTER TABLE

Nota:

Se debe mencionar que si se dejan en blanco los campos user, host o db, se har referencia a cualquier usuario, servidor o base de datos. El mismo efecto lo crea colocar el smbolo % en el campo.

Pg.18de142

Programadeformacin:BASEDEDATOSMySQL

UNIDAD 2: Administracin bsica de bases de datos MySQL

Objetivo de la Unidad: Aplicar las servidor MySQL de forma bsica.

instrucciones para administrar un

Temas: Crear y administrar usuarios Permisos de usuarios Crear y Eliminar bases de datos

Pg.19de142

Programadeformacin:BASEDEDATOSMySQL
Ver la informacin sobre el servidor y su funcionamiento

Crear y administrar usuarios

Comandos GRANT y REVOKE Los Comandos GRANT y REVOKE son utilizados para conceder y retirar los derechos de los usuarios de MySQL. Hay cuatro niveles de privilegio, estos niveles son:

Global Base de datos Tabla Columna

Comando GRANT

Este comando se utiliza para crear usuarios y concederle privilegios. A continuacin se presenta la sintaxis general del comando GRANT es la siguiente:

Pg.20de142

Programadeformacin:BASEDEDATOSMySQL
GRANT privilegios (columnas) ON elemento TO nombre_usuario IDENTIFIED BY 'contrasea' (whith grant option);

En el ejemplo presentado antes se puede observar que lo que se encuentra escrito entre parntesis son opcionales y que los parntesis pueden o no ser colocados. Es muy importante que al final se utilice el ";" y pulsar "intro", ya que si se presenta algn error mysql indicar en que lnea se encuentra ste. Primero, se ver privilegios, que equivale a una lista de privilegios separados por comas. Comando REVOKE Es lo contrario del comando opuesto al GRANT. Se utiliza para retirar privilegios de un usuario.

Su sintaxis es muy similar a la sintaxis de GRANT:

REVOKE privilegios [(columnas)] ON elemento FROM nopmbre_de_usuario

Los privilegios concedidos con la clusula WITH GRANT OPTION, pueden ser revocados de la siguiente forma:

Pg.21de142

Programadeformacin:BASEDEDATOSMySQL

REVOKE GRANT OPTION ON elemento FROMnombre_de_usuario

Ejemplos de GRANT y REVOKE.

Si se desea configurar un administrador, se puede escribir: mysql > grant all -> on * -> to julia identified by 'Qe4w' -> with grant option;

Es importante tener en cuenta que el punto y coma se dejar en la ltima lnea, de esta forma si se comete algn error nos dir en que lnea se encuentra el mismo. En este ejemplo se puede observar que a julia se le han otorgado todos los privilegios sobre todas las Bases de Datos existentes, con la contrasea Qe4w. Este tipo de privilegio slo es aconsejable para los administradores, y no para el usuario; por lo que conviene quitrselos por mayor seguridad.

Pg.22de142

Programadeformacin:BASEDEDATOSMySQL
mysql > revoke all -> on * -> from julia; Configuracin de un usuario normal mysql > grant usage -> on peliculas .* -> to julia identified by 'Qe4w';

De ahora en adelante, los privilegios sern concedidos en funcin de los que se ha pedido hacer, colocando los privilegios adecuados mysq > grant select, insert, update, delete, index, alter, create, drop -> on peliculas .* -> to julia;

Como ya se ha creado la contrasea al crear un usuario sin privilegios, no hace falta colocarla, es suficiente con slo colocar los privilegios. Pero resulta que julia no ha respetado las normas que se le dijo y se desea quitarle privilegios:

mysql > revoke alter, create, drop -> on peliculas.* -> from julia;

Pg.23de142

Programadeformacin:BASEDEDATOSMySQL
Si en definitiva nos comunica que no quiere ms ser usuario de la BD se coloca revocar : mysql > revoke all -> on peliculas.* -> from julia;

Niveles de privilegios y tipos

Existen tres tipos bsicos de privilegios en MySQL Privilegios apropiados para su concesin a los usuarios habituales. Privilegios apropiados para su concesin a los administradores. Dos privilegios especiales. Para contar con ms seguridad en la Bases de Datos (BD) se deben considerar los diferentes privilegios que se le conceden a los usuarios o a los administradores, ya que de ellos depender que las Base de Datos sean hackeadas. Se aconseja que los administradores tengan todos los privilegios, y que los usuarios tengan el nivel ms bajo de los mismos. Si se entienden claramente estos principios de los comandos GRANT y REVOKE; se puede entender cmo crear un usuario y que privilegios darle en nuestra Base de Datos.

Pg.24de142

Programadeformacin:BASEDEDATOSMySQL

Cambios de password de root con el programa mysqladmin: [shell]# mysqladmin -u root password nuevo_password Ahora se agregarn algunos usuarios para ver como funciona este sistema: Si se desean aadir usuarios, se utilizar el comando GRANT, el cual cuenta con la sintaxis que se presenta a continuacin: GRANT priv_type [(column list)] [, priv_tipe[(column_lis)] ...] ON {table_name | * | *.* | db_name.*} TO user_name [IDENTIFIED BY 'password'] [, user_name [IDENTIFIED BY 'password'] ...] [WITH GRANT OPTION] Esto puede parecer ms difcil de lo que es en realidad, imagnese que se desea crear un usuario llamado Pedro con todos los permisos sobre su base de datos llamada pedro_db, y que solo pueda conectarse desde cualquier mquina de dominio.com, para lograrlo se hace algo como lo presentado a continuacin:

[shell]# mysql -p Enter password: mysql> GRANT insert,select,update,delete,create,drop,alter ON

Pg.25de142

Programadeformacin:BASEDEDATOSMySQL
pedro_db.* TO pedro@"%.dominio.com" IDENTIFIED BY 'p3dr0'; Para explicar lo anterior, a un usuario llamado pedro que se conectar desde cualquier mquina de dominio.com, cuyo password ser p3dr0 se le otorga permiso para hacer ( insert, select, update ... ) sobre cualquier tabla de pedro_db. Ahora, se crear otro superusuario llamado ferdy que tendr todos los privilegios, y que podr conectarse desde cualquier sitio: mysql> GRANT ALL PRIVILEGES ON *.* TO ferdy@"%" IDENTIFIED BY 'gh4limones25tf' WITH GRANT OPTION; mysql> GRANT ALL PRIVILEGES ON *.* TO ferdy@localhost IDENTIFIED BY 'gh4limones25tf' WITH GRANT OPTION; Al realizar esto se tendr el nuevo superusuario. Supngase por ltimo que se desea borrar a Pedro, ya que los usuarios se guardan en la base de datos mysql en la tabla user: mysql> use mysql; mysql> DELETE FROM user WHERE user = 'pedro';

Con esto Pedro habr desaparecido de nuestro sistema MySQL.

Pg.26de142

Programadeformacin:BASEDEDATOSMySQL
Y al darse cuenta que Ferdy no debera tener tantos permisos, se le quitarn los mismos sobre la base de datos usuarios:

mysql> REVOKE ALL PRIVILEGES ON usuarios.* FROM ferdy;

Ferdy no tendr ms permisos sobre la base de datos usuarios. A continuacin se presenta la sintaxis de REVOKE:

REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...] ON {table_name | * | *.* | db_name.*} FROM user_name [, user_name ...]

Permisos de usuarios

Se deberan tomar en cuenta seriamente las siguientes sugerencias, para convertir un sistema MySQL en seguro,:

Pg.27de142

Programadeformacin:BASEDEDATOSMySQL
Se deben utilizar las claves para todos los usuarios MySQL. Un programa cliente no necesariamente reconoce la identidad de la persona que lo utilizan. Es comn en las aplicaciones cliente/servidor que el usuario pueda especificar cualquier nombre de usuario al programa cliente. Por ejemplo, cualquiera puede utilizar el programa mysql para conectarse como cualquier otra persona, simplemente invocndolo de la siguiente manera: mysql -u otro_usuario nombre_bd cuando otro_usuario no tiene clave. Si todos los usuarios tienen una clave, es mucho ms difcil conectarse si se utiliza la cuenta de otro usuario. Si se desea cambiar la clave de un usuario, se debe utilizar la sentencia SET PASSWORD. Tambin es posible alterar la tabla user en la base de datos mysql de forma directa. Por ejemplo, haga lo siguiente si se desea cambiar la clave de todas las cuentas MySQL que tienen por nombre de usuario root: shell> mysql -u root mysql> UPDATE mysql.user SET Password=PASSWORD('newpwd') -> WHERE User='root'; mysql> FLUSH PRIVILEGES; Nunca se debe ejecutar el servidor MySQL con el usuario root de Unix. Esto es extremadamente peligroso porque cualquier usuario con el privilegio FILE es capaz de crear archivos como root (por ejemplo, ~root/.bashrc). Para evitar esto, mysqld rechaza ejecutarse como root a menos que se utilice explcitamente la opcin --user=root.

Pg.28de142

Programadeformacin:BASEDEDATOSMySQL
En cambio, mysqld puede, y debe, ser ejecutado por medio de un usuario normal sin privilegios. Se puede crear una cuenta de Unix especfica llamada mysql para que todo sea an ms seguro. Se debe utilizar esta cuenta slo para administrar MySQL. Si se desea ejecutar el mysqld por medio de un usuario de Unix diferente, agregue la opcin user la cual especifica el nombre de usuario al grupo [mysqld] del archivo de opciones /etc/my.cnf o al archivo de opciones my.cnf que se encuentra en el directorio de datos del servidor. Por ejemplo: [mysqld] user=mysql Al hacer esto se provoca que el servidor se inicie mediante el usuario designado, ya sea ejecutado de forma manual o por medio del mysqld_safe o mysql.server. Al ejecutar mysqld como un usuario Unix diferente de root no significa que se necesite cambiar el usuario root de la tabla user. Los usuarios de las cuentas MySQL no tienen nada que ver con los usuarios de las cuentas Unix. No permita el uso de enlaces simblicos a tablas. Esto puede ser desactivado con la opcin --skip-symbolic-links.) Esto es muy importante si se ejecuta mysqld como root, ya que cualquier persona que tenga acceso de escritura al directorio de datos del servidor podra borrar cualquier archivo en el sistema!. Asegurarse de que el nico usuario Unix con permisos de lectura o escritura en los directorios de la base de datos sea el usuario que ejecuta mysqld. No otorgar los privilegios PROCESS o SUPER a usuarios no-administrativos. La salida del de mysqladmin processlist muestra el texto de cualquier

Pg.29de142

Programadeformacin:BASEDEDATOSMySQL
sentencia que se est ejecutando, as que cualquier usuario al que se permita ejecutar dicho comando puede ser capaz de ver si otro usuario ejecuta una sentencia UPDATE user SET password=PASSWORD('not_secure'). mysqld se reserva una conexin extra para usuarios que tengan el privilegio SUPER, de esta forma un usuario root puede conectarse y comprobar la actividad del servidor an cuando todas las conexiones normales se encuentren en uso. El privilegio SUPER puede ser utilizado para cerrar conexiones de cliente, cambiar el funcionamiento del servidor modificando el valor de variables del sistema, y controlar servidores de replicacin. No otorgarle el privilegio FILE a usuarios no-administrativos. Cualquier usuario que posea este privilegio puede escribir un archivo en cualquier de lugar del sistema de archivos con los privilegios del demonio mysqld. Si se desea que esto sea poco ms seguro, los archivos generados con SELECT ... INTO OUTFILE no sobreescriben los archivos existentes, y pueden ser escritos por cualquiera. El privilegio FILE tambin puede ser utilizado para leer cualquier archivo que sea legible por cualquiera o accesible para el usuario Unix que ejecuta el servidor. Con este privilegio, se podra, por ejemplo, leer cualquier archivo e insertarlo en una tabla de la base de datos. Esto podra ser utilizado, por ejemplo, al usar LOAD DATA para cargar /etc/passwd en una tabla, la cual podra mostrarse luego un SELECT. Si no se confa en sus DNS, se podran utilizar los nmeros IP en lugar de los nombres en las tablas de permisos (tablas grant). En cualquier caso, debera se

Pg.30de142

Programadeformacin:BASEDEDATOSMySQL
debe ser muy cuidadoso al crear registros en las tablas de permiso utilizando nombres que contengan caracteres comodn. Si se desea restringir el nmero de conexiones permitidas para una misma cuenta, se puede lograr al establecer la variable max_user_connections de mysqld. La sentencia GRANT tambin soporta opciones de control de recursos para limitar la extensin de uso de servidor permitido a una cuenta.

Crear/Eliminar/Modificar Bases de Datos

Una vez se tengan los usuarios definidos, y dependiendo de los permisos asignados a cada uno de ellos, se pueden utilizar algunos comandos para la creacin, eliminacin y modificacin de las bases de datos existentes en el servidor.

Crear Bases de Datos

CREATE DATABASE

CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification:

Pg.31de142

Programadeformacin:BASEDEDATOSMySQL
[DEFAULT] CHARACTER SET charset_name | [DEFAULT] COLLATE collation_name

CREATE DATABASE crea una base de datos con el nombre dado. Para usar CREATE DATABASE se necesita el privilegio CREATE en la base de datos.

Tambin existen reglas para los nombres permitidos de bases de datos, tablas, ndices, y columnas. Si la base de datos ya existe y no se ha especificado IF NOT EXISTS, se producir un error

Se

pueden

usar

las

opciones

create_specification

para

especificar

caractersticas de las base de datos desde MySQL 4.1.1. Estas caractersticas se almacenan en el archivo 'db.opt' en el directorio de la base de datos. La clusula CHARACTER SET especifica el conjunto de caracteres por defecto para la base de datos. La clausula COLLATE especfica el conjunto de reglas de comparacin de caracteres (collation) por defecto para la base de datos. Para obtener ms detalles sobre los juegos de caracteres y las reglas de comparacin de caracteres ver Caracteres y Reglas.

Las bases de datos se implementan como directorios que contienen los ficheros correspondientes a las tablas de la base de datos en MySQL . Como no existen tablas en una base de datos cuando esta se crea, la sentencia CREATE

Pg.32de142

Programadeformacin:BASEDEDATOSMySQL
DATABASE slo crea un directorio bajo el directorio "data" de MySQL (y el archivo 'db.opt' para MySQL 4.1.1 y siguientes).

Eliminar Bases de datos

Si se desea eliminar una base de datos que ya no es necesaria en el sistema se cuenta, al menos, con dos mtodos. Se ejecuta en un ventana de Terminal. $ mysql -h servidor -u usuario -p Enter password: mysql> DROP DATABASE nombre_de_la_base_de_datos; quit El comando DROP DATABASE borrar todas las tablas en la base de datos y borrar la base de datos. Se debe ser muy cuidadoso con este comando! Para usar DROP DATABASE, se necesita el permiso DROP en la base de datos. Si se utiliza DROP DATABASE en una base de datos enlazada

simblicamente, tanto el enlace como la base de datos se borran. El comando DROP DATABASE retorna el nmero de tablas que se eliminan. Se corresponde con el nmero de archivos .frm borrados.

Pg.33de142

Programadeformacin:BASEDEDATOSMySQL
El comando DROP DATABASE borrar del directorio de base de datos los archivos y los directorios que MySQL puede crear durante las operaciones normales: Todos los archivos con estas extensiones:

. . . MYI db

. . . frm

. . .

BAK DAT HSH MRG MYD ISD

Todos los subdirectorios con nombres que tienen dos dgitos hexadecimales 00-ff. son subdirectorios utilizados por las tablas RAID. Estos directorios no se borran desde MySQL 5.0, cuando se elimina el soporte para tablas RAID. Las tablas RAID deben ser convertidas y antes de actualizar MySQL 5.0 se deben eliminar estos directorios manualmente. El archivo db.opt, de existir. El directorio de base de datos no puede ser borrado, si otros archivos o directorios permanecen en el directorio de la base de datos despus de que MySQL halla borrado los archivos listados. En este caso, se debe borrar cualquier archivos restante de froma manual y se debe realizar el comando DROP DATABASE una vez ms.

Pg.34de142

Programadeformacin:BASEDEDATOSMySQL
http://dev.mysql.com/doc/refman/5.0/es/drop-database.html

UNIDAD 3: Operaciones sobre tablas

Objetivo de la Unidad: Emplear

las instrucciones necesarias para

administrar tablas y registros dentro de MySQL.

Temas: Crear tablas Tipos de campos Modificar la estructura de una tabla, agregar o eliminar nuevos campos Eliminar tablas Listar el contenido de una tabla

Crear tablas

CREAR UNA TABLA

Pg.35de142

Programadeformacin:BASEDEDATOSMySQL
CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(definicin_create,...)] [opciones_tabla] [sentencia_select]

O CREATE [TEMPORARY] TABLE [IF NOT EXISTS] tbl_name [(] LIKE viejo_tbl_name [)];

Sintaxis de definicin_create:

definicin_columnas | [CONSTRAINT [smbolo]] PRIMARY KEY (index_nombre_col,...) | KEY [nombre_index] (nombre_col_index,...) | INDEX [nombre_index] (nombre_col_index,...) | [CONSTRAINT [smbolo]] UNIQUE [INDEX] [nombre_index] [tipo_index] (nombre_col_index,...) | [FULLTEXT|SPATIAL] [INDEX] [nombre_index] (nombre_col_index,...) | [CONSTRAINT [smbolo]] FOREIGN KEY [nombre_index] (nombre_col_index,...) [definicin_referencia] | CHECK (expr)

Pg.36de142

Programadeformacin:BASEDEDATOSMySQL

Sintaxis de definicin_columnas:

nombre_col tipo [NOT NULL | NULL] [DEFAULT valor_por_defecto] [AUTO_INCREMENT] [[PRIMARY] KEY] [COMMENT 'string'] [definicin_referencia]

Sintaxis de tipo:

TINYINT[(longitud)] [UNSIGNED] [ZEROFILL] | SMALLINT[(longitud)] [UNSIGNED] [ZEROFILL] | MEDIUMINT[(longitud)] [UNSIGNED] [ZEROFILL] | INT[(longitud)] [UNSIGNED] [ZEROFILL] | INTEGER[(longitud)] [UNSIGNED] [ZEROFILL] | BIGINT[(longitud)] [UNSIGNED] [ZEROFILL] | REAL[(longitud,decimales)] [UNSIGNED] [ZEROFILL] | DOUBLE[(longitud,decimales)] [UNSIGNED] [ZEROFILL] | FLOAT[(longitud,decimales)] [UNSIGNED] [ZEROFILL] | DECIMAL(longitud,decimales) [UNSIGNED] [ZEROFILL] | NUMERIC(longitud,decimales) [UNSIGNED] [ZEROFILL]

Pg.37de142

Programadeformacin:BASEDEDATOSMySQL
| DATE | TIME | TIMESTAMP | DATETIME | CHAR(longitud) [BINARY | ASCII | UNICODE] | VARCHAR(longitud) [BINARY] | TINYBLOB | BLOB | MEDIUMBLOB | LONGBLOB | TINYTEXT | TEXT | MEDIUMTEXT | LONGTEXT | ENUM(valor1,valor2,valor3,...) | SET(valor1,valor2,valor3,...) | tipo_spatial

Sintaxis de nombre_col_index:

Pg.38de142

Programadeformacin:BASEDEDATOSMySQL
nombre_col [(longitud)] [ASC | DESC]

Sintaxis de definicin_referencia:

REFERENCES nombre_tbl [(nombre_col_index,...)] [MATCH FULL | MATCH PARTIAL | MATCH SIMPLE] [ON DELETE opcin_referencia] [ON UPDATE opcin_referencia]

Sintaxis de opcin_referencia:

RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT

Sintaxis de opciones_tabla:

opcin_tabla [opcin_tabla] ...

Sintaxis de opcin_tabla:

{ENGINE|TYPE} = {BDB|HEAP|ISAM|InnoDB|MERGE|MRG_MYISAM|MYISAM } Pg.39de142

Programadeformacin:BASEDEDATOSMySQL
| AUTO_INCREMENT = valor | AVG_ROW_LENGTH = valor | CHECKSUM = {0 | 1} | COMMENT = 'cadena' | MAX_ROWS = valor | MIN_ROWS = valor | PACK_KEYS = {0 | 1 | DEFAULT} | PASSWORD = 'cadena' | DELAY_KEY_WRITE = {0 | 1} | ROW_FORMAT = { DEFAULT|DYNAMIC|FIXED|COMPRESSED|REDUNTANT| COMPACT} | RAID_TYPE = { 1 | STRIPED | RAID0 } RAID_CHUNKS=valor RAID_CHUNKSIZE=valor | UNION = (nombre_tabla,[nombre_tabla...]) | INSERT_METHOD = { NO | FIRST | LAST } | DATA DIRECTORY = 'camino de directorio absoluto' | INDEX DIRECTORY = 'camino de directorio absoluto' | [DEFAULT] CHARACTER SET nombre_conjunto_caracteres [COLLATE nombre_cotejo]

Pg.40de142

Programadeformacin:BASEDEDATOSMySQL
Sintaxis de sentencia_select:

[IGNORE | REPLACE] [AS] SELECT ...

(Alguna sentencia select legal)

Por medio del comando CREATE TABLE se crea una tabla con el nombre especificado. Se debe contar con el privilegio CREATE para la tabla.

La tabla se crea en la base de datos acta por defecto. Si la tabla ya existe se producir un error, si no hay una base de datos actual o si la base de datos no existe.

El nombre de la tabla se puede especificar, en versiones de MySQL 3.22 y posteriores, como db_name.tbl_name para la creacin de la tabla en una base de datos especfica. Esto funciona aunque no exista una base de datos seleccionada. Si se escribe el nombre de la tabla entre comillas, el nombre de la base de datos y el de la tabla se deben entrecomillar por separado. Por ejemplo, `midb`.`mitabla` es legal, pero `midb.mitabla` no lo es.

Se puede usar la palabra clave TEMPORARY cuando se quiere crear una tabla desde la versin 3.23 de MySQL. La tabla temporal slo se encuentra visible para la conexin actual, y ser borrada de forma automtica cuando al cerrar la conexin. Esto significa que dos conexiones diferentes pueden usar, de forma simultnea, el mismo nombre para una tabla temporal sin conflictos entre

Pg.41de142

Programadeformacin:BASEDEDATOSMySQL
ellas o con una tabla existente con el mismo nombre. Por otro lado, la tabla existente se ocultar hasta que la tabla temporal sea borrada. Para crear las tablas temporales desde MySQL 4.0.2 se debe tener el privilegio CREATE TEMPORARY TABLES.

Se puede usar IF NOT EXISTS de modo que no se obtiene un error si la tabla ya existe desde la versin 3.23 de MySQL. No se verifica si la tabla existente tiene una estructura idntica a la indicada por la sentencia CREATE TABLE.

Al no especificar ni NULL ni NOT NULL, la columna se trata como si se hubiese especificado NULL.

Una columna entera puede tener el atributo adicional AUTO_INCREMENT. Cuando se inserta un valor NULL, que es lo que se recomienda, o 0 en una columna indexada AUTO_INCREMENT, el siguiente valor secuencial se utiliza como valor para dicha columna. Normalmente, ese valor es valor+1, donde valor es el mayor valor en la columna actual en la tabla. Las secuencias AUTO_INCREMENT empiezan en 1.

Nota: slo puede existir una columna AUTO_INCREMENT por tabla, y debe estar indexada y no puede tener un valor DEFAULT.

Pg.42de142

Programadeformacin:BASEDEDATOSMySQL
En la versin 3.23 de MySQL una columna AUTO_INCREMENT slo funcionar de forma correcta si contiene valores positivos. La insercin de un nmero negativo se considera como un nmero positivo muy grande. Esto se hace para evitar que por problemas de precisin los nmeros pasen de positivo a negativo, y tambin para asegurar que una columa AUTO_INCREMENT contenga un cero de forma accidental. En las tablas MyISAM y BDB se puede especificar AUTO_INCREMENT en una columna secundaria dentro de una clave multi-columna. Para hacer MySQL compatible con algunas aplicaciones ODBC, se puede encontrar el valor AUTO_INCREMENT para la ltima fila insertada mediante la siguiente consulta:

SELECT * FROM tbl_name WHERE auto_col IS NULL

Las definiciones de columnas de caracteres pueden incluir un atributo CHARACTER SET para especificar el conjunto de caracteres y, opcionalmente, un conjunto de reglas de comparacin para la columna desde la versin 4.1 de MySQL. Ver apndice C.

CREATE TABLE t (c CHAR(20) CHARACTER SET utf8 COLLATE utf8_bin);

Se puede especificar un comentario para una columna con la opcin COMMENT. El comentario se muestra mediante la sentencia SHOW CREATE TABLE, y por SHOW FULL COLUMNS. Esta opcin se encuentra disponible desde MySQL 4.1. En versiones anteriores est permitida pero se ignora. Pg.43de142

Programadeformacin:BASEDEDATOSMySQL

KEY normalmente es sinnimo de INDEX. Desde la versin 4.1, el atributo de clave PRIMARY KEY puede especificarse tambin como KEY. Esto se ha implementado para compatibilidad con otras base de datos.

Una clave UNIQUE slo puede contener valores diferentes en MySQL. Si se intenta insertar una fila nueva con una clave que coincida con la de una fila existente se genera un error. Se considera una excepcin si una columna en el ndice puede tomar valores NULL, entonces puede contener mltiples valores NULL. Esta excepcin no se aplica a tablas BDB, para las que una columna indexada permite slo un valor NULL.

Una PRIMARY KEY es una KEY nica donde todas las columnas clave deben encontrase definidas como NOT NULL. Esto debe hacerse implcitamente, y discretamente, si no se han declarado especficamente como NOT NULL. Una tabla slo puede contener una PRIMARY KEY. Si no se tiene una y alguna aplicacin solicita una, MySQL devolver el primer ndice UNIQUE que no tenga columnas NULL, como PRIMARY KEY.

Se coloca la PRIMARY KEY, seguida por todos los ndices UNIQUE, y despus los ndices no nicos en la tabla creada. Esto ayuda al optimizador de MySQL para dar prioridad sobre cul ndice se debe utilizar y para detectar de forma ms rpida las claves UNIQUE duplicadas.

Pg.44de142

Programadeformacin:BASEDEDATOSMySQL
Una PRIMARY KEY puede ser un ndice multicolumna. Sin embargo, no se puede crear un ndice multicolumna utilizando el atributo PRIMARY KEY en la especificacin de columna. Al hacer esto slo se marca esa columna como primaria. Se debe utilizar una clusula adicional PRIMARY KEY(nombre_col_index, ...).

Si la clave PRIMARY o UNIQUE consta slo de una columna y es de tipo entero, se tambin se puede referenciar como _rowid en una sentencia SELECT, desde la Versin 3.23.11.

En MySQL, el nombre de un PRIMARY KEY es PRIMARY. Para otros ndices, si no se asigna un nombre, se le asigna el mismo nombre que la primera columna indexada, con un sufijo opcional (_2, _3. ...) para hacerlo nico. Se pueden ver los nombres de los ndices usando la sentencia SHOW INDEX FROM nombre_tabla.

Algunos motores de almacenamiento permiten especificar un tipo de ndice cuando este es creado desde MySQL 4.1.0,. La sintaxis para el especificador de tipo_indice es USING nombre_tipo. Por ejemplo:

CREATE TABLE lookup (id INT, INDEX USING BTREE (id)) ENGINE = MEMORY;

Pg.45de142

Programadeformacin:BASEDEDATOSMySQL

Slo las tablas de tipos MyISAM, InnoDB, BDB y, desde MySQL 4.0.2, MEMORY soportan ndices en columnas que contengan valors NULL. En otros casos se deben declarar esas columnas como NOT NULL o se producir un error.

Se puede crear un ndice que utilice slo los primeros 'longitud' bytes de una columna CHAR o VARCHAR con al sintaxis col_name(longitud) en una especificacin de un ndice; esto puede causar que el archivo de ndices sea mucho ms pequeo. Las tablas de tipos MyISAM y, desde MySQL 4.0.14, InnoDB soportan la indexacin en columnas BLOB y TEXT. Cuando se utiliza un ndice en una columna BLOB o TEXT se debe especificar siempre la longitud de los ndices. Por ejemplo:

CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));

Los prefijos pueden tener hasta 255 bytes de longitud, o 1000 bytes para tablas MyISAM y InnoDB desde MySQL 4.1.2. Ntese que los lmites de los prefijos se miden en bytes, aunque la longitud del prefijo en sentencias CREATE INDEX se interpretan por nmero de caracteres. Se debe tener esto en cuenta al especificar una longitud de prefijo para una columna que utiliza un conjunto de caracteres multi-byte.

Pg.46de142

Programadeformacin:BASEDEDATOSMySQL
Una especificacin de nombre_col_index puede terminar con ASC o DESC. Estas palabras clave se encuentran permitidas para futuras extensiones para la especificacin de almacenamiento de ndices ascendentes o descendentes. En la actualidad, se verifica su sintaxis, pero se ignoran. Los valores de ndices siempre se almacenan en orden ascendente.

El servidor ordena los valores usando slo los bytes iniciales indicados por la variable del servidor max_sort_length, al utilizar ORDER BY o GROUP BY con una columna TEXT o BLOB,.

Se pueden crear ndices especiales FULLTEXT en versiones de MySQL 3.23.23 o posteriores, stos se utilizan para realizar bsquerdas de texto completo. Slo las tablas de tipo MyISAM soportan ndices FULLTEXT, stos slo pueden ser creados desde columnas CHAR, VARCHAR y TEXT. La indexacin siempre se hace sobre la columna completa; la indexacin parcial no se encuentra soportada y cualquier longitud de prefijo es ignorada si se especifica.

Se pueden crear ndices SPATIAL en columnas de tipo espacial a partir de MySQL 4.1. Los tipos especiales se soportan slo para tablas MyISAM y las columnas indexadas deben declararse como NOT NULL.

Las tablas InnoDB soportan la verificacin para restricciones de claves forneas a partir de la versin 3.23.44 de MySQL. Se deben tener en cuenta que la sintaxis para FOREIGN KEY en InnoDB es mucho ms restrictiva que la sintaxis Pg.47de142

Programadeformacin:BASEDEDATOSMySQL
presentada antes: las columnas en la tabla referenciada deben ser nombradas de forma explcita. InnoDB soporta las acciones ON DELETE y ON UPDATE para las claves ajenas, tanto para MySQL 3.23.50 como para 4.0.8, respectivamente. Para otros tipos de tablas, el servidor MySQL verifica la sintaxis de FOREIGN KEY, CHECK y REFERENCES en comandos CREATE TABLE, pero no se toma ninguna accin.

Cada columna NULL requiere un bit extra, redondeando hacia arriba al siguiente byte, para las tablas MyISAM e ISAM. El tamao mximo para un registro, en bytes, puede calcularse de la siguiente forma:

row length = 1 + (sum of column lengths) + (number of NULL columns + delete_flag + 7)/8 + (number of variable-length columns)

El comando delete_flag es 1 para las tablas con formato de registro esttico. Las tablas estticas utilizan un bit en una fila de registro como un bandern que indica si la fila ha sido borrada. El comando delete_flag es 0 para tablas dinmicas ya que el bandern se almacena en una fila de cabecera dinmica. Estos clculos no se aplican a tablas InnoDB, para las que el tamao de almacenamiento no es diferente que para las columnas NULL si se compara

Pg.48de142

Programadeformacin:BASEDEDATOSMySQL
con las NOT NULL. La parte opciones_tabla de CREATE TABLE slo se encuentran disponibles desde MySQL 3.23.

Las opciones ENGINE y TYPE especifican el motor de almacenamiento para la tabla. ENGINE se aadi en MySQL 4.0.18, para 4.0, y 4.1.2, para 4.1. Esta es la opcin sugerida desde esas versiones, y TYPE queda desaconsejada. TYPE obtendr soporte a lo largo de la serie 4.x series, pero se eliminar en MySQL 5.1.

Las opciones ENGINE y TYPE pueden tomar los valores presentados a continuacin: BDB: Tablas de transaccin segura con bloqueo de pgina. BerkeleyDB: Alias para BDB. HEAP: los datos para esta tabla slo se almacenan en memoria. ISAM: es el motor de almacenamiento original de MySQL. InnoDB: son las tablas de transaccin segura con bloqueo de fila y claves forneas. MEMORY: es el alias para HEAP. MERGE: es una coleccin de tablas MyISAM utilizadas como una tabla. MRG_MyISAM : es un alias para MERGE. MyISAM: es el nuevo motor binario de almacenamiento portable que reemplaza a ISAM.

Pg.49de142

Programadeformacin:BASEDEDATOSMySQL

MySQL utilizar el tipo MyISAM, si se especifica un tipo de tabla, y ese tipo particular no se encuentra disponible. Por ejemplo, si la definicin de la tabla incluye la opcin ENGINE=BDB pero el servidor MySQL no soporta las tablas BDB, la tabla se crear como una tabla MyISAM. Esto hace posible tener un sistema de rplica donde se tienen tablas operativas en el maestro pero las tablas creadas en el esclavo no son operativas, con el fin de obtener mayor velocidad. En MySQL 4.1.1 se obtiene un aviso si el tipo de tabla especificado no es aceptable.

Se puede crear una tabla a partir de otra aadiendo la sentencia SELECT al final de la sentencia CREATE TABLE desde MySQL 3.23,:

CREATE TABLE new_tbl SELECT * FROM orig_tbl;

MySQL crear nuevos campos para todos los elementos del SELECT. Por ejemplo:

mysql> CREATE TABLE test (a INT NOT NULL AUTO_INCREMENT, -> -> PRIMARY KEY (a), KEY(b)) TYPE=MyISAM SELECT b,c FROM test2;

Pg.50de142

Programadeformacin:BASEDEDATOSMySQL
Con esto se crear una tabla MyISAM con tres columnas, a, b y c. Se debe tener presente que dichas tres columnas de la sentencia SELECT se aaden al lado derecho de la tabla, no superpuestos. Vase el siguiente ejemplo:

mysql> SELECT * FROM foo; +---+ |n| +---+ |1| +---+ mysql> CREATE TABLE bar (m INT) SELECT n FROM foo; Query OK, 1 row affected (0.02 sec) Records: 1 Duplicates: 0 Warnings: 0

mysql> SELECT * FROM bar; +------+---+ |m |n|

+------+---+ | NULL | 1 | +------+---+ 1 row in set (0.00 sec)

Pg.51de142

Programadeformacin:BASEDEDATOSMySQL

Se inserta una fila en bar con los valores de foo y los valores por defecto para las nuevas columnas para cada una de la filas en la tabla foo.

sta se eliminar de forma automtica y no se crear si se produce cualquier error mientras se copian los datos a la tabla.

Al utilizar CREATE TABLE ... SELECT no se crearn los indices de forma automtica. Esto se ha hecho de forma intencionada para hacer el comando tan flexible como sea posible. Si se quiere tener ndices en la tabla creada, se puede especificar despus de la sentencias SELECT:

mysql> CREATE TABLE bar (UNIQUE (n)) SELECT n FROM foo;

Tambin, se pueden producir algunas conversiones de tipos de columna. Por ejemplo, el atributo AUTO_INCREMENT no se preserva, y las columnas VARCHAR se pueden convertir en CHAR.

Al crear una tabla con CREATE ... SELECT, hay que asegurarse de crear un alias para cualquier llamada a funcin o expresin en la consulta. Al no hacerlo, la sentencia CREATE podr fallar o puede dar como resultado nombres de columna no deseados.

Pg.52de142

Programadeformacin:BASEDEDATOSMySQL
CREATE TABLE artists_and_works SELECT artist.name, COUNT(work.artist_id) AS number_of_works FROM artist LEFT JOIN work ON artist.id = work.artist_id GROUP BY artist.id;

se puede especificar explcitamente el tipo para una columna generada desde MySQL 4.1:

CREATE TABLE foo (a TINYINT NOT NULL) SELECT b+1 AS a FROM bar;

Tambin, se puede usar LIKE para crear una tabla vaca basada en la definicin de otra tabla, incluyendo cualquier atributo de columna e indices que tenga la tabla original en MySQL 4.1:

CREATE TABLE new_tbl LIKE orig_tbl;

El comando CREATE TABLE ... LIKE no copia ninguna opcin de tabla DATA DIRECTORY o INDEX DIRECTORY que se haya especificado en la tabla original, o cualquier definicin de clave fornea.

Se puede preceder el SELECT por IGNORE o REPLACE para indicar como manipular los registros que dupliquen las claves nicas. Con IGNORE, los nuevos

Pg.53de142

Programadeformacin:BASEDEDATOSMySQL
registros que dupliquen la clave nica de un registro existente sern descartados. Con REPLACE, los nuevos registros reemplazan a los que tengan el mismo valor de clave nica. Si no se especifica IGNORE ni REPLACE, la repeticin de claves nicas producir un error.

MySQL no permite la insercin concurrente durante CREATE TABLE ... SELECT para asegurar la utilizacin del diario de modificacin para recrear las tablas originales.

Tipos de campos

Con MySQL se tienen habilitados diversos tipos de campos que en una primera aproximacin podran clasificarse en tres grupos: Campos numricos Campos de fecha Campos de cadenas de caracteres

Campos numricos MySQL ofrece soporte para los tipos numricos exactos (INTEGER, NUMERIC, DECIMAL, y SMALLINT) y los tipos numricos aproximados (FLOAT, DOUBLE precision y REAL). Los campos que contienen nmeros enteros admiten el parmetro Pg.54de142

Programadeformacin:BASEDEDATOSMySQL
UNSIGNED que implica que no admita signos por lo que solo aceptara enteros positivos. Todos los campos numricos admiten el parmetro ZEROFILL cuya funcin es completar el campo con ceros a la izquierda hasta su longitud mxima.

Tipos de campos numricos enteros Estos son los distintos tipos de campos numricos enteros que admite MySQL. Los parmetros sealados entre corchetes son opcionales. TINYINT [(M)] [UNSIGNED] [ZEROFILL]

Es nmero entero muy pequeo. Con la opcin UNSIGNED puede tomar valores entre 0 y 255. En caso contrario, puede estar comprendido entre -128 y 127. Si el parmetro ZEROFILL solo tiene sentido junto con la opcin UNSIGNED ya que no tiene ningn sentido tratar de rellenar con ceros a la izquierda de un nmero negativo.

El valor por defecto de parmetro M, o nmero de cifras es 4 si la opcin UNSIGNED no se encuentra activada. De encontrarse activada, el valor por defecto sera M=3. Para valores de M >valor por defecto reajusta el tamao al valor por defecto.

Pg.55de142

Programadeformacin:BASEDEDATOSMySQL
Al asignarle a M un valor menor que cuatro se limita el nmero de caracteres al tamao especificado tomando en cuenta el signo slo en los nmeros negativos. Por ejemplo, si M=3 admitira 148 pero si intentamos insertar -148 recortara por la izquierda y solo insertara -14.

Si se trata de insertar un valor fuera de rango se registrara el valor dentro del rango ms prximo a ste.

Por ejemplo: al tratar de insertar el valor 437 se escribira 127 255, este ltimo en el caso de tener la opcin UNSIGNED. Si se desease insertar -837 con la opcin UNSIGNED se escribira 0 y sin ella pondra -128.

El tamao de un campo TINYINT es de 1 byte.

SMALLINT [(M)] [UNSIGNED] [ZEROFILL]

Es un nmero entero pequeo. Con la opcin UNSIGNED se pueden tomar valores entre 0 y 65 535. De otra forma, ste puede estar comprendido entre -32 768 y 32 767. Los comentarios hechos para TINYINT son vlidos, con la excepcin de los relativos a los valores por defecto de M que en este caso seran 6 5. Su tamao es de 2 bytes.

Pg.56de142

Programadeformacin:BASEDEDATOSMySQL

MEDIUMINT [(M)] [UNSIGNED] [ZEROFILL]

Es un nmero entero mediano. Con la opcin UNSIGNED puede tomar valores entre 0 y 16 777 215. En caso contrario, ste puede estar comprendido entre -8 388 608 y 8 388 607. Tambin son vlidos los comentarios hechos para TINYINT excepto los relativos al valor por defecto de M que en este caso seran 8. Su tamao es de 3 bytes.

INT [(M)] [UNSIGNED] [ZEROFILL]

Es un nmero entero. Con la opcin UNSIGNED se pueden tomar valores entre 0 y 4 294 967 295. De otra forma, ste puede estar comprendido entre -2 147 483 648 y 2 147 483 647. Son vlidos todos los comentarios de los casos anteriores. Su tamao es de 4 bytes.

INTEGER [(M)] [UNSIGNED] [ZEROFILL]

Es un sinnimo de INT

BIGINT [(M)] [UNSIGNED] [ZEROFILL]

Pg.57de142

Programadeformacin:BASEDEDATOSMySQL

Son nmeros enteros grandes. Con la opcin UNSIGNED se pueden tomar valores entre 0 y 18 446 744 073 709 551 615. En caso contrario, ste puede estar comprendido entre -9 223 372 036 854 775 808 y 21 474 839 223 372 036 854 775 807 647, pero al usarlo desde PHP se encontrar sujeto a las limitaciones mximas de los valores numricos de este. Son vlidos todos los comentarios de los casos anteriores. Su tamao es de 8 bytes.

Nmeros de coma flotante Debido a la estructura binaria de los microprocesadores y ya que algunos nmeros no enteros, sin ir ms lejos el 0.1, se requeriran infinitos caracteres binarios para su representacin exacta, se hace necesario introducir un redondeo en su tratamiento informtico y como consecuencia de ello asumir que se generan errores de medida. Esta circunstancia oblig al tratamiento de los nmeros decimales mediante el llamado Estndar de Aritmtica de Punto Flotante, un algoritmo definido por la IEEE (Instituto de Ingenieros Elctricos y Electrnicos) que unific los procesos de representacin de nmeros en ordenadores por medio del cual los errores introducidos son uniformemente controlables.

El Estndar de Aritmtica de Punto Flotante estableci dos niveles de precisin:

Pg.58de142

Programadeformacin:BASEDEDATOSMySQL
Precisin Simple en la que todo nmero debe ser almacenado en 32 bits (4 bytes) Doble precisin en la que los nmeros se almacenan en 64 bits (8 bytes ). El MySQL admite los siguientes tipos de nmeros de coma flotante: FLOAT(x) [ZEROFILL]

Es un nmero de coma flotante. ste ignora la opcin UNSIGNED pero si acepta ZEROFILL por lo que se debe prestar atencin a estas opciones ya que no sera demasiado habitual una presentacin como esta: 000-3.47

El valor de x especifica la precisin. Si x<=24 ser de precisin simple. Cuando 24 <x <=53 lo convertir automticamente a doble precisin. Al no especificar el valor de x el campo se considera como de precisin simple. Su tamao es de 4 bytes si x<=24 y de 8 bytes cuando 24 <x <=53

FLOAT [(M,D)] [ZEROFILL]

Es un nmero de coma flotante de precisin simple. Son vlidos los comentarios relativos a las opciones UNSIGNED y ZEROFILL del caso anterior. Toma valores en los intervalos siguientes:

Pg.59de142

Programadeformacin:BASEDEDATOSMySQL
-3.402823466E+38 a -1.175494351E-38 0y 1.175494351E-38 a 3.402823466E+38. M es la anchura mxima de visualizacin y D es el nmero de decimales. Si M > 24 se convierte a doble precisin FLOAT de forma automtica sin argumentos, representa un nmero de coma flotante y precisin simple.

DOUBLE [(M,D)] [ZEROFILL]

Es un nmero de coma flotante de doble precisin. Siguen siendo vlidos los comentarios relativos a las opciones UNSIGNED y ZEROFILL del caso anterior. Toma valores en los intervalos siguientes:

-1.7976931348623157E+308 a -2.2250738585072014E-308 0y 2.2250738585072014E-308 a 1.7976931348623157E+308 M es la anchura mxima de visualizacin y D es el nmero de decimales. FLOAT

Pg.60de142

Programadeformacin:BASEDEDATOSMySQL

Sin argumentos, representa un nmero de coma flotante y precisin doble.

REAL [(M,D)] [ZEROFILL]

Es sinnimo de DOUBLE.

DECIMAL [(M[,D])] [ZEROFILL]

Es un nmero de coma flotante y doble precisin que se almacena como un campo de tipo CHAR.

Se guarda el valor como una cadena donde cada caracter representa una cifra. En el valor de M -anchura mxima de visualizacin, la coma y el signo menos de los nmeros negativos no se toman en cuenta, aunque si se reserva un espacio en campo para ellos de forma automtica.

Si D vale 0 no tendr parte decimal. Los nmeros toman valores en el mismo intervalo especificado para DOUBLE. Los valores por defecto de M y D son respectivamente 10 y 0. Ocupan M+2 bytes si D > 0; M+1 bytes si D = 0 D+2 bytes si M < D

Pg.61de142

Programadeformacin:BASEDEDATOSMySQL
NUMERIC(M,D) [ZEROFILL]

Se comporta de forma idntica a DECIMAL

Campos de fecha Con MySQL se cuenta con campos especficos para el almacenamiento de fechas. stos son los siguientes:

DATE

Con DATE se recoge una fecha dentro del intervalo 01-01-1000 a 31-129999. MySQL guarda los valores DATE con formato AAAA-MM-DD (ao-mes-da ). Su tamao es de 3 bytes.

DATETIME

Con DATETIME se recoge una combinacin de fecha y hora dentro del intervalo 00:00:00 del da 01-01-1000 y las23:59:59 del da 31-12-9999. MySQL guarda los valores DATETIME con formato AAAA-MM-DD HH:MM:SS (ao-mes-da hora:minutos:segundos) . Su tamao es de 8 bytes. TIME

Pg.62de142

Programadeformacin:BASEDEDATOSMySQL
Con TIME se recoge una hora dentro del intervalo -838:59:59 a 838:59:59. MySQL guarda los valores TIME con formato HH:MM:SS (horas:minutos:segundos) . Su tamao es de 3 bytes.

YEAR YEAR(2) YEAR(4) Con stos se recoge un ao en formato de cuatro cifras (YEAR YEAR(4)) o en formato de dos cifras (YEAR(2))dentro del intervalo 1901 a 2155 en el caso de cuatro cifras de 1970 a 2069 si se trata de dos cifras. Su tamao es de 1 byte.

TIMESTAMP [(M)] Con ste se recoge un tiempo UNIX. El intervalo vlido va desde 01-011970 00:00:00 a cualquier fecha del ao 2037. El parmetro M puede tomar los valores: 14 (valor por defecto), 12, 8, o 6 que se corresponden con los formatos AAAAMMDDHHMMSS, AAMMDDHHMMSS, AAAAMMDD, o AAMMDD. Si se le asigna la opcin NUL guardar la hora actual. Cuando se asigna 8 14 como parmetros es considerado como un nmero y para las dems opciones como una cadena. Independientemente del valor del parmetro, un campo TIMESTAMP siempre ocupa 4 bytes.

Campos tipo cadena de caracteres CHAR (M) [BINARY]

Pg.63de142

Programadeformacin:BASEDEDATOSMySQL
Es una cadena de tamao fijo que se completa a la derecha por espacios si es necesario.

El parmetro M puede valer de 1 a 255 caracteres. Los espacios finales son suprimidos cuando al insertar la cadena en el registro. Los valores de tipo CHAR son elegidos y comparados sin tener en cuenta ni Maysculas ni Minsculas y utilizan el juego de caracteres por defecto.

Se puede utilizar el operador BINARY para hacer la cadena sensible a Maysculas / Minsculas. Se puede utilizar un campo tipo CHAR(0) con el atributo NULL para almacenar una valor booleano. En este caso ocupar un solo byte y podr tener nicamente dos valores: NUL "". Su tamao es de M bytes siendo 1 <= M <= 255 .

VARCHAR(M) [BINARY]

Es una cadena de caracteres de longitud variable. Su tamao mximo, especificado en el parmetro M, puede estar comprendido entre 1 y 255 caracteres. Con la opcin BINARY es capaz de discriminar entre Maysculas / minsculas.

TINYBLOB y TINYTEXT

Pg.64de142

Programadeformacin:BASEDEDATOSMySQL
Son cadenas de caracteres de longitud variable con un tamao mximo de 255 (28 - 1) caracteres. La diferencia entre ambas es que TINYBLOB si discrimina entre Maysculas y Minsculas, mientras que TINYTEXT no lo hace. Ninguno de los campos: BLOB y TEXT admite valores por DEFECTO Las versiones de MySQL anteriores a 3.23.2 permiten utilizar estos campos para indexar.

Si se intenta guardar en un campo de este tipo una cadena de mayor longitud que la especificada slo se guardarn los M primeros caracteres de la cadena.

BLOB o TEXT

Estas son cadenas de caracteres de longitud variable con un tamao mximo de 65535 (2 16 - 1) caracteres. La diferencia entre ambas es que BLOB si discrimina entre Maysculas y Minsculas, mientras que TEXT no lo hace. Ninguno de los campos: BLOB y TEXT admite valores por DEFECTO .

MEDIUMBLOB o MEDIUMTEXT

stas son cadenas de caracteres de longitud variable con una longitud mxima de 16.777.215 (2 24 - 1) caracteres. Las especificaciones hechas en el apartado anterior son vlidas. El tamao mximo de los campos de este tipo se

Pg.65de142

Programadeformacin:BASEDEDATOSMySQL
encuentra sujeto a las limitaciones externas tales como la memoria disponible y el tamao del buffer de comunicacin servidor/cliente.

LONGBLOB o LONGTEXT

La nica diferencia con la anterior es el tamao mximo de la cadena, que para este caso es de 4.294.967.295 (2 32 - 1) caracteres.

ENUM('valor1','valor2',...)

Es una cadena de caracteres que contiene uno solo de los valores de la lista (valor1, valor2, etc. etc.). Cuando se desea insertar un nuevo registro en una tabla, el valor a especificar para un campo de este tipo debe ser una cadena que contenga uno de los valores especificados en la tabla. Si se tratara de insertar un valor distinto de ellos insertara una cadena vaca.

SET('valor1','valor2','valor3'...)

Es una cadena de caracteres formados por la unin uno varios de los valores de una lista. El mximo de elementos es 64. Los valores que deben escribirse en los registros de la tabla que contiene este campo deben ser numricos expresados en forma binaria o en forma decimal.

Pg.66de142

Programadeformacin:BASEDEDATOSMySQL

Modificar la estructura de una tabla, agregar o eiminar nuevos campos

ALTER TABLE

ALTER [IGNORE] TABLE tbl_name alter_specification [, alter_specification ...]

Sintaxis para alter_specification:

ADD [COLUMN] create_definition [FIRST | AFTER column_name ] | ADD [COLUMN] (create_definition, create_definition,...) | ADD INDEX [index_name] (index_col_name,...) | ADD [CONSTRAINT [symbol]] PRIMARY KEY (index_col_name,...) | ADD [CONSTRAINT [symbol]] UNIQUE [index_name] (index_col_name,...) | ADD FULLTEXT [index_name] (index_col_name,...) Pg.67de142

Programadeformacin:BASEDEDATOSMySQL
| ADD [CONSTRAINT [symbol]] FOREIGN KEY [index_name]

(index_col_name,...) [reference_definition] | ALTER [COLUMN] col_name {SET DEFAULT literal | DROP DEFAULT} | CHANGE [COLUMN] old_col_name create_definition [FIRST | AFTER column_name] | MODIFY [COLUMN] create_definition [FIRST | AFTER column_name] | DROP [COLUMN] col_name | DROP PRIMARY KEY | DROP INDEX index_name | DISABLE KEYS | ENABLE KEYS | RENAME [TO] new_tbl_name | ORDER BY col | CHARACTER SET character_set_name [COLLATE collation_name] | table_options

El ALTER TABLE permite modificar la estructura de una tabla existente. Por ejemplo, se pueden aadir o eliminar columnas, crear y destruir ndices, cambiar el tipo de una columna existente o renombrar columnas o la propia tabla. Tambin es posible modificar el comentario y el tipo de la tabla.

Pg.68de142

Programadeformacin:BASEDEDATOSMySQL
Al utilizar ALTER TABLE para cambiar la especificacin de una columna pero DESCRIBE tbl_name se indica que la columna no ha cambiado, es posible que MySQL haya ignorado la modificacin por alguna razn. Por ejemplo, si se ha intentado cambiar una columna VARCHAR a CHAR, MySQL seguir usando VARCHAR si la tabla contiene otras columnas de longitud variable.

ALTER TABLE trabaja creando una copia temporal de la tabla original. La modificacin se lleva a cabo durante la copia, luego la tabla original se borra y la nueva se renombra. Esto se lleva acabo para hacer que todas las actualizaciones se dirijan a la nueva tabla sin ningn fallo de actualizacin. Mientras ALTER TABLE se ejecuta, la tabla original permanece accesible en lectura para otros clientes. Las actualizaciones y escrituras en la tabla se retrasan hasta que la nueva tabla se encuentre preparada.

Se debe tener en cuenta que si se usa otra opcin para ALTER TABLE como RENAME, MySQL siempre se crear una tabla temporal, aunque no sea estrictamente necesario copiarla, como cuando se cambia el nombre de una columna. Est previsto corregir esto en el futuro, pero como no es corriente usar ALTER TABLE para hacer esto, no es algo urgente de hacer. Para tablas MyISAM, se puede aumentar la velocidad de la recreacin de ndices, que es la parte ms lenta del proceso, asignando un valor alto a la variable myisam_sort_buffer_size.

Si se desea utilizar ALTER TABLE, es necesario tener los privilegios ALTER, INSERT y CREATE en la tabla. IGNORE es una extensin MySQL a SQL-92. sta

Pg.69de142

Programadeformacin:BASEDEDATOSMySQL
controla el modo de trabajar de ALTER TABLE si hay claves duplicadas o nicas en la nueva tabla. Si no se especifica IGNORE, la copia se aborta y se deshacen los cambios. Si se especifica IGNORE, en las filas duplicadas en una clave nica slo se copia la primera fila; el resto se eliminan.

Se pueden usar mltiples clusulas ADD, ALTER, DROP y CHANGE en una sentencia sencilla ALTER TABLE. Esto es una extensin MySQL aSQL-92, que permite slo una aparicin de cada clusula en una sentencia ALTER TABLE. CHANGE col_name, DROP col_name y DROP INDEX tambin son extensiones MySQL a SQL-92. MODIFY es una extensin Oracle a ALTER TABLE.

La palabra opcional COLUMN es una palabra ruidosa y puede ser omitida. Si se utiliza ALTER TABLE tbl_name RENAME TO new_name sin ninguna otra opcin, MySQL sencillamente renombra los archivos que corresponden con la tabla tbl_name. No hay necesidad de crear una tabla temporal.

Las clusulas create_definition utilizan la misma sintaxis para ADD y CHANGE que CREATE TABLE. Esta sintaxis incluye slo el nombre de columna, no el tipo. Se puede renombrar una columna utilizando una clusula CHANGE old_col_name create_definition. Para hacerlo, se deben especificar los nombres antiguo y nuevo de la columna y el tipo que la columna tiene actualmente. Por ejemplo, para renombrar una columna INTEGER desde a a b, se puede hacer esto:

Pg.70de142

Programadeformacin:BASEDEDATOSMySQL
mysql> ALTER TABLE t1 CHANGE a b INTEGER;

Si se desea cambiar el tipo de una columna, pero no su nombre, la sintaxis de CHANGE sigue necesitando un nombre de columna antiguo y nuevo, aunque mantenga en mismo nombre. Por ejemplo:

mysql> ALTER TABLE t1 CHANGE b b BIGINT NOT NULL;

Sin embargo, desde la versin 3.22.16a de MySQL, se puede usar tambin MODIFY para modificar el tipo de una columna sin renombrarla:

mysql> ALTER TABLE t1 MODIFY b BIGINT NOT NULL;

Si se utiliza CHANGE o MODIFY para acortar una columna para la cual existe un ndice en parte de la columna, por ejemplo, si se tiene un ndice en los primeros 10 caracteres de una columna VARCHAR, no ser posible acortar la columna a un nmero de caracteres menos que los indexados.

Al cambiar un tipo de columna usando CHANGE o MODIFY, MySQL intenta convertir datos al nuevo tipo lo mejor posible. En las versiones 3.22 o siguientes de MySQL, se puede usar FIRST o ADD ... AFTER col_name para aadir una columna en una posicin especfica dentro de una fila de la tabla. Por defecto se

Pg.71de142

Programadeformacin:BASEDEDATOSMySQL
aade la columna al final. Desde MySQL 4.0.1, se pueden usar las palabras FIRST y AFTER en un CHANGE o MODIFY.

Al utilizar ALTER COLUMN se especifica un nuevo valor por defecto para una columna o elimina el valor por defecto anterior. Si se elimina el anterior valor por defecto y la columna puede ser NULL, el nuevo valor por defecto es NULL. Si la columna no puede ser NULL, MySQL asigna un nuevo valor por defecto, como se describe en CREATE TABLE. DROP INDEX elimina un ndice. Esto es una extensin MySQL para SQL-92. Ver la sintaxis de DROP INDEX.

Si se quitan columnas de una tabla, tambin se eliminan de cualquier ndice de las que formen parte. Si todas las columnas que forman parte de un ndice se eliminan, el ndice se elimina tambin.

Si la tabla contiene slo una columna, sta no puede ser eliminada. Si lo que se pretende es eliminar la tabla, se debe usar DROP TABLE.

Con DROP PRIMARY KEY se elimina el ndice primario. Si no existiera ese ndice, se eliminar el primer ndice UNIQUE de la tabla. El MySQL marca la primera clave UNIQUE como la PRIMARY KEY si no se ha especificado una PRIMARY KEY de forma explcita. Si se aade una UNIQUE INDEX o una PRIMARY

Pg.72de142

Programadeformacin:BASEDEDATOSMySQL
KEY a la tabla, se almacena antes de cualquier ndice UNIQUE de modo que MySQL pueda detectar claves duplicadas lo ms pronto posible.

El comando ORDER BY permite crear una nueva tabla con un orden especfico para las filas. La tabla no permanecer en ese orden despus de nuevas inserciones o borrados. En algunos casos, es ms fcil hacer que MySQL ordene, si la tabla se encuentra indexada por la columna por la que se desea ordenarla ms adelante. Esta opcin es corriente, principalmente, cuando se sabe que se va a consultar la tabla en un orden determinado; es posible obtener un mejor rendimiento al utilizar esta opcin despus de grandes campos en la tabla.

Si se utiliza ALTER TABLE en una tabla MyISAM, todos los ndices no nicos sern creados en un proceso separado (como en REPAIR). Esto hace ALTER TABLE mucho ms rpido al existir muchos ndices.

la caracterstica anterior puede ser activada explcitamente desde MySQL 4.0. ALTER TABLE ... DISABLE KEYS hace que MySQL detenga la actualizacin de ndices no nicos para tablas MyISAM. ALTER TABLE ... ENABLE KEYS debe ser usado para recrear ndices perdidos. Como MySQL hace esto con un algoritmo especial que es mucho ms rpido cuando se insertan claves una a una, desactivar las claves puede proporcionar una considerable mejora de tiempo cuando se inserta gran cantidad de filas. Con la funcin del API de C mysql_info, se puede obtener todos los registros que han sido copiados, y, si se ha utilizado

Pg.73de142

Programadeformacin:BASEDEDATOSMySQL
IGNORE, todos los registros que fueron borrados por la duplicacin de valores de clave.

Las clusulas FOREIGN KEY, CHECK y REFERENCES no hacen nada en la actualidad, excepto para tablas del tipo InnoDB que soportant ... ADD [CONSTRAINT [symbol]] FOREIGN KEY (...) REFERENCES ... (...) y ... DROP FOREIGN KEY .... Ver restricciones FOREIGN KEY. La sintaxis para otros tipos de tabla se proporciona slo por compatibilidad, para hacer ms fcil portar cdigo desde otros servidores SQL y para ejecutar aplicaciones que crean tablas con referencias.

Con ALTER TABLE se ignoran las opciones de tabla DATA DIRECTORY y INDEX DIRECTORY. Si se desea cambiar todas las columnas CHAR/VARCHAR/TEXT a un nuevo juego de caracteres, por ejemplo despus de actualizar desde MySQL 4.0.x a 4.1.1, se puede hacer:

ALTER TABLE table_name CHARACTER SET character_set_name;

El comando presentado a continuacin slo cambia el juego de caracteres por defecto para la tabla:

ALTER character_set_name;

TABLE

table_name

DEFAULT

CHARACTER

SET

Pg.74de142

Programadeformacin:BASEDEDATOSMySQL

El juego de caracteres por defecto es el que se utiliza si no se especifica un juego de caracteres para una nueva columna que se aada a la tabla (por ejemplo con ALTER TABLE ... ADD column).

Luego, se muestra un ejemplo que demuestra como utilizar ALTER TABLE. Se puede comenzar creando una tabla t1 como:

mysql> CREATE TABLE t1 (a INTEGER,b CHAR(10));

Si se desea renombrar la tabla de t1 a t2:

mysql> ALTER TABLE t1 RENAME t2; Si se desea cambiar la columna a de INTEGER a TINYINT NOT NULL (dejando el mismo nombre), y cambiar la columna b de CHAR(10) a CHAR(20) y adems renombrando de b a c:

mysql> ALTER TABLE t2 MODIFY a TINYINT NOT NULL, CHANGE b c CHAR(20 );

Si se desea aadir una columna TIMESTAMP llamada d:

Pg.75de142

Programadeformacin:BASEDEDATOSMySQL
mysql> ALTER TABLE t2 ADD d TIMESTAMP;

Si se desea aadir un ndice en la columna d, y hacer la columna a la clave primaria:

mysql> ALTER TABLE t2 ADD INDEX (d), ADD PRIMARY KEY (a);

Si se desea eliminar la columna c:

mysql> ALTER TABLE t2 DROP COLUMN c;

Si se desea aadir una nueva columna entera AUTO_INCREMENT llamada c:

mysql> ALTER TABLE t2 ADD c INT UNSIGNED NOT NULL AUTO_INCREMENT, ADD INDEX (c);

Se debe anotar que se debe indexar en c, porque las columnas AUTO_INCREMENT deben estar indexadas, y tambin que hemos declarado c como NOT NULL, porque las columnas indexadas no pueden ser NULL.

Pg.76de142

Programadeformacin:BASEDEDATOSMySQL
Al aadir una columna AUTO_INCREMENT, los calores de columna se llenan con una secuencia numrica de forma automtica. Se puede elegir el primer nmero de la secuencia ejecutando SET INSERT_ID=value antes de ALTER TABLE o usando la opcin de tabla AUTO_INCREMENT=value.

Al una

utilizar

las

tablas

MyISAM, y

si

no

se se

modifica aade

la otra

columna columna

AUTO_INCREMENT, la secuencia de numrica no resultar afectada. Si se elimina columna AUTO_INCREMENT despus AUTO_INCREMENT, los nmeros empezarn a partir de 1 otra vez.

Eliminar tablas

Con DROP TABLE se elimina una o ms tablas. Se debe poseer el privilegi DROP para cada una de las tablas. Se eliminan tanto los datos que contengan y las definiciones de las tablas, as que hay que tener cuidado con esta sentencia. DROP [TEMPORARY] TABLE [IF EXISTS] tbl_name [, tbl_name] ... Se pueden utilizar las palabras clave IF EXISTS para evitar el error que ocurrira al intentar eliminar tablas que no existan. Desde MySQL 4.1, se genera una nota para cada tabla inexistente cuando se usa IF EXISTS, en MySQL 3.22 y posteriores. La palabra clave TEMPORARY se ignora en MySQL 4.0. Desde la versin 4.1, tiene el efecto siguiente:

Pg.77de142

Programadeformacin:BASEDEDATOSMySQL

* La sentencia elimina slo tablas temporales (TEMPORARY). * La sentencia no termina ninguna transaccin en curso. * No se verifican derechos de acceso. (Una tabla temporal slo es visible para el cliente que la ha creado, de modo que no es necesaria la verificacin).

Utilizar TEMPORARY es una buena forma de asegurar que no se eliminar una tabla no temporal de forma accidental.

Listar el contenido de una tabla SHOW COLUMNS SHOW FIELDS

SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [LIKE 'patrn']

Con SHOW COLUMNS se listan las columnas de una tabla especificada. Si los tipos de columna difieren de los que se esperaba a partir de la sentencia CREATE TABLE utilizada, hay que tener en cuenta que, algunas veces, MySQL cambia los tipos de columnas cuando se crea o se altera una tabla. Las condiciones para que esto ocurra se describen al final de CREATE TABLE.

Pg.78de142

Programadeformacin:BASEDEDATOSMySQL
A partir de MySQL 3.23.32 se puede utilizar la palabra clave FULL. sta causa que la salida incluya los privilegios que se poseen para cada columna. A partir de MySQL 4.1, FULL tambin causa que se muestre cualquier comentario por columna que exista.

Tambin, se puede utilizar db_name.tbl_name como una alternativa a la sintaxis tbl_name FROM db_name syntax, ya que estas dos sentencias son equivalentes:

mysql> SHOW COLUMNS FROM mytable FROM mydb; mysql> SHOW COLUMNS FROM mydb.mytable;

El SHOW FIELDS es un sinnimo de SHOW COLUMNS. Con ste tambin se pueden listar las columnas de una tabla con el comando mysqlshow db_name tbl_name.

La sentencia DESCRIBE proporciona informacin similar a SHOW COLUMNS. SHOW TABLES

SHOW [FULL|OPEN] TABLES [FROM nombre_db] [LIKE 'patrn']

Pg.79de142

Programadeformacin:BASEDEDATOSMySQL
Con SHOW TABLES se listan las tablas no temporales en una base de datos especificada. Tambin, se puede obtener esta lista utilizando el comando mysqlshow db_name. Antes de MySQL 5.0.1, la salida de SHOW TABLES contena una nica columna con los nombres de las tablas. A partir de MySQL 5.0.1, tambin se listan las vistas de la base de datos. A partir de MySQL 5.0.2, se soporta el modificador FULL de modo que SHOW FULL TABLES muestra una segunda columna. Los valores de esta segunda columna son BASE TABLE para una tabla y VIEW para una vista.

Nota: si no se dispone de privilegios para una tabla, la tabla no ser mostrada en la salida de SHOW TABLES o mysqlshow db_name.

Con SHOW OPEN TABLES se listan las tablas que se encuentren actualmente abiertas en la cach de tablas. El campo de comentario en la salida indica las veces que la tabla est en el cach y en uso. OPEN puede usarse a partir de MySQL 3.23.33.

Pg.80de142

Programadeformacin:BASEDEDATOSMySQL

UNIDAD 4: Transacciones

Objetivo de la Unidad: Utilizar las funciones especificas para realizar transacciones en MySQL de forma eficiente.

Pg.81de142

Programadeformacin:BASEDEDATOSMySQL
Temas: Transacciones Estructuras bsicas de una transaccin Ejecucin de transacciones en un servidor MySQL

Transacciones

Con las transacciones se aade una fiabilidad superior a las bases de datos. Con el uso de transacciones se puede tener la seguridad de que nunca se quedar a medio camino de su ejecucin, si se dispone de una serie de consultas SQL que deben ejecutarse en conjunto. De hecho, se puede decir que las transacciones aportan una caracterstica de "deshacer" a las aplicaciones de bases de datos. Teniendo esto en mente, las tablas que soportan transacciones, como es el caso de InnoDB, son mucho ms seguras y fciles de recuperar si se produce algn fallo en el servidor, ya que las consultas se ejecutan o no en su totalidad. Por otra parte, las transacciones pueden hacer que las consultas tarden ms tiempo en ejecutarse.

Estructuras bsicas de una transaccin

Los pasos para utilizar las transacciones en MySQL son:

Pg.82de142

Programadeformacin:BASEDEDATOSMySQL
Iniciar una transaccin con el uso de la sentencia BEGIN. Actualizar, insertar o eliminar registros en la base de datos. Si se desea realizar cambios a la base de datos, se completa la transaccin con el uso de la sentencia COMMIT. Slo cuando se procesa un COMMIT, los cambios hechos por las consultas sern permanentes. En caso de que ocurra algn problema, se puede hacer uso de la sentencia ROLLBACK para cancelar los cambios que han sido realizados por las consultas que han sido ejecutadas hasta el momento. Los ejemplos presentados a continuacin ejecutan algunas consultas para ver como trabajan las transacciones. Lo primero que se debe hacer es crear una tabla del tipo InnoDB e insertar algunos datos. Si se desea crear una tabla InnoDB se utiliza el SQL estndar CREATE TABLE, pero se debe especificar que se trata de una tabla del tipo InnoDB (TYPE= InnoDB). Esto es aplicable a cualquier tipo de tabla, pero cuando no se especifica nada, MySQL supone que se trata de una tabla MyISAM.

mysql> CREATE TABLE innotest (campo INT NOT NULL PRIMARY KEY) TYPE = InnoDB; Query OK, 0 rows affected (0.10 sec) mysql> INSERT INTO innotest VALUES(1); Query OK, 1 row affected (0.08 sec) mysql> INSERT INTO innotest VALUES(2); Query OK, 1 row affected (0.01 sec) Pg.83de142

Programadeformacin:BASEDEDATOSMySQL
mysql> INSERT INTO innotest VALUES(3); Query OK, 1 row affected (0.04 sec) mysql> SELECT * FROM innotest; +-------+ | campo | +-------+ | | | 1| 2| 3|

+-------+ 3 rows in set (0.00 sec) Al utilizar las transacciones. mysql> BEGIN; Query OK, 0 rows affected (0.01 sec) mysql> INSERT INTO innotest VALUES(4); Query OK, 1 row affected (0.00 sec) mysql> SELECT * FROM innotest; +-------+Esto es aplicable a cualquier tipo de tabla, pero cuando no se especifica nada, MySQL supone que se trata de una tabla MyISAM. | campo | +-------+ Pg.84de142

Programadeformacin:BASEDEDATOSMySQL
| | | | 1| 2| 3| 4|

+-------+ 4 rows in set (0.00 sec) Ahora, al ejecutar un ROLLBACK, no se completar la transaccin y los cambios realizados sobre la tabla no tendrn efecto. mysql> ROLLBACK; Query OK, 0 rows affected (0.06 sec) mysql> SELECT * FROM innotest; +-------+ | campo | +-------+ | | | 1| 2| 3|

+-------+ 3 rows in set (0.00 sec) Entonces, qu sucede si se pierde la conexin al servidor antes de que la transaccin sea completada?.

Pg.85de142

Programadeformacin:BASEDEDATOSMySQL
mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO innotest VALUES(4); Query OK, 1 row affected (0.00 sec) mysql> SELECT * FROM innotest; +-------+ | campo | +-------+ | | | | 1| 2| 3| 4|

+-------+ 4 rows in set (0.00 sec) mysql> EXIT; Bye Al obtener de nuevo la conexin, se puede verificar que el registro no se insert ya que la transaccin no fue completada. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 449 to server version: 4.0.13 Type 'help;' or '\h' for help. Type '\c' to clear the buffer. Pg.86de142

Programadeformacin:BASEDEDATOSMySQL
mysql> SELECT * FROM innotest; +-------+ | campo | +-------+ | | | 1| 2| 3|

+-------+ 3 rows in set (0.00 sec) Luego, se repite la sentencia INSERT ejecutada antes, pero con COMMIT antes de perder la conexin al servidor al salir del monitor de MySQL. mysql> BEGIN; Query OK, 0 rows affected (0.00 sec) mysql> INSERT INTO innotest VALUES(4); Query OK, 1 row affected (0.00 sec) mysql> COMMIT; Query OK, 0 rows affected (0.02 sec) mysql> EXIT; Bye un

Pg.87de142

Programadeformacin:BASEDEDATOSMySQL
Al realizar un COMMIT, la transaccin se completa, y todas las sentencias SQL que se ejecutaron antes afectan de manera permanente las tablas de la base de datos. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 450 to server version: 4.0.13 Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> SELECT * FROM innotest; +-------+ | campo | +-------+ | | | | 1 2 3 4 | | | |

+-------+ 4 rows in set (0.00 sec) Otras consideraciones

MySQL se ejecuta en modo autocommit por defecto. Esto significa que tan pronto como se ejecuta una sentencia se actualiza o modifica la tabla, entonces, MySQL almacenar la actualizacin en disco.

Pg.88de142

Programadeformacin:BASEDEDATOSMySQL

Al utilizar las tablas de transaccin segura, como InnoDB o BDB, se puede poner MySQL en modo no-autocommit utilizando el siguiente comando:

SET AUTOCOMMIT=0

Al desconectar el modo autocommit asignando cero a la variable AUTOCOMMIT, se debe usar COMMIT para almacenar los cambios en disco o ROLLBACK, si se quieren ignorar los cambios hechos desde el principio de la transaccin.

Si se desea desactivar el modo autocommit para una serie de sentencias, se puede usar una sentencia START TRANSACTION:

START TRANSACTION; SELECT @A:=SUM(salary) FROM table1 WHERE type=1; UPDATE table2 SET summmary=@A WHERE type=1; COMMIT;

Se puede usar BEGIN y BEGIN WORK en lugar de START TRANSACTION para iniciar una transaccin. START TRANSACTION fue aadido en MySQL 4.0.11; es la sintaxis SQL-99 y es el modo recomendado para empezar una transaccin.

Pg.89de142

Programadeformacin:BASEDEDATOSMySQL
BEGIN y BEGIN WORK estn disponibles desde MySQL 3.23.17 y 3.23.19, respectivamente.

Si no se estn usando tablas de transaccin segura, cualquier cambio ser almacenado autocommit. inmediatamente, independientemente del estado del modo

Al utilizar una sentencia ROLLBACK despus de actualizar una tabla no transaccional, se obtendr un error (ER_WARNING_NOT_COMPLETE_ROLLBACK) en forma de aviso. Todas las tablas de transaccin segura sern restauradas, pero cualquier tabla de transaccin no segura no cambiar.

Si se quiere utilizar START TRANSACTION o SET AUTOCOMMIT=0, se debe utilizar el diario binario MySQL para copias de seguridad en lugar del diario de actualizacin antiguo. Las transacciones se almacenan en el diario binario de una sola vez, despus de COMMIT, para asegurar que las transacciones que se han rebobinado no se almacenen.

Ejecucin de transacciones en un servidor

Si se desean utilizar las transacciones se requiere un servidor MySQL con soporte para el tipo de tablas InnoDB. En nuestro caso se hace uso de un servidor MySQL 4.013 ejecutndose en un sistema.

Pg.90de142

Programadeformacin:BASEDEDATOSMySQL

Para asegurarse que tenemos soporte para el tipo de tablas InnoDB se puede ejecutar la sentencia presentada a continuacin:

mysql> SHOW VARIABLES LIKE '%innodb%'; +---------------------------------+------------+ | Variable_name |ValueEn nuestro caso se hace uso de un servidor MySQL 4.013 ejecutndose en un sistema. | +---------------------------------+------------+ | have_innodb | YES | | innodb_additional_mem_pool_size | 1048576 | | innodb_buffer_pool_size | 8388608 | | innodb_data_file_path | ibdata:30M | | innodb_data_home_dir | | | innodb_file_io_threads | 4 | | innodb_force_recovery | 0 | | innodb_thread_concurrency | 8 | | innodb_flush_log_at_trx_commit | 1 | | innodb_fast_shutdown | ON | | innodb_flush_method | | | innodb_lock_wait_timeout | 50 | | innodb_log_arch_dir | .\ | | innodb_log_archive | OFF | | innodb_log_buffer_size | 1048576 | | innodb_log_file_size | 5242880 |

Pg.91de142

Programadeformacin:BASEDEDATOSMySQL
| innodb_log_files_in_group | 2 | | innodb_log_group_home_dir | .\ | | innodb_mirrored_log_groups | 1 | | innodb_max_dirty_pages_pct | 90 | +---------------------------------+------------+ 20 rows in set (0.00 sec)

La variable ms importante es por supuesto have_innodb que tiene el valor YES. De hecho, una de las principales caractersticas de las tablas del tipo InnoDB es que pueden trabajar con transacciones, o sentencias SQL que son agrupadas como una sola. Un ejemplo tpico de esto es una transaccin bancaria. Por ejemplo, si una cantidad de dinero es transferida de la cuenta de una persona a otra, se requerirn por lo menos dos consultas:

UPDATE cuentas SET balance = balance - cantidad_transferida WHERE cliente = persona1; UPDATE cuentas SET balance = balance + cantidad_transferida WHERE cliente = persona2

Las dos consultas mencionadas antes deben trabajar bien, pero qu sucede si ocurre algn imprevisto y "se cae" el sistema despus de que se ejecuta la primer consulta, pero la segunda an no se ha completado?. La

Pg.92de142

Programadeformacin:BASEDEDATOSMySQL
persona1 tendr una cantidad de dinero removida de su cuenta, y creer que ha realizado su pago, sin embargo, la persona2 estar enfadada puesto que pensar que no se le ha depositado el dinero que le deben. En este ejemplo tan sencillo se ilustra la necesidad de que las consultas sean ejecutadas de manera conjunta, o en su caso, que no se ejecute ninguna de ellas. Debido a esto es que transacciones toman un papel muy importante.

Welcome to the MySQL monitor.

Pg.93de142

Programadeformacin:BASEDEDATOSMySQL

UNIDAD 5: Acceso remoto a MySQL

Objetivo de la Unidad: Utilizar las opciones disponibles para administrar un servidor MySQL de forma remota

Temas: Acceso remoto a MySQL Usando telnet/SSH TCP/IP

Acceso Remoto

Ya que MySQL utiliza conexiones no encriptadas, o inseguras, entre el cliente y el servidor de manera predeterminada, significa que cualquier individuo mal intencionado puede ver, y an modificar los datos que son transmitidos entre s. Esta situacin puede ser peligrosa, dependiendo del tipo de informacin

Pg.94de142

Programadeformacin:BASEDEDATOSMySQL
que se est manejando, por lo tanto, puede ser necesario buscar un mtodo o mecanismo que permita asegurar que los datos que son transmitidos a travs de una red son confiables.

El SSL es un protocolo que utiliza diferentes algoritmos de encriptacin para asegurarse de que los datos que viajan a travs de una red pblica, por ejemplo la Internet, pueden ser confiables. En la versin 4.0, MySQL se ofrecer soporte nativo para el SSL, por los momentos, en las versiones 3.23.x de MySQL se puede utilizar el SSH para crear un canal de comunicacin seguro, es decir, al utilizar el SSH se puede establecer una conexin encriptada entre un cliente y un servidor MySQL. El SSH es un protocolo que proporciona autenticacin, encriptacin e integridad de datos para garantizar las comunicaciones en una red. En principio es una solucin bastante efectiva para resolver el problema de la inseguridad de los datos que viajan sobre una red.

Lo que se pretende es dar a conocer cules son los pasos a seguir para poder crear un canal de comunicacin seguro entre un cliente y un servidor MySQL utilizando el protocolo SSH.

Port Forwarding

El SSH ofrece una herramienta muy poderosa llamada Port Forwarding, que permite asegurar prcticamente cualquier tipo de servicio basado en el

Pg.95de142

Programadeformacin:BASEDEDATOSMySQL
protocolo TCP/IP. Esto significa que, por ejemplo, se pueden encriptar los datos que manejan los protocolos de correo electrnico ms utilizados, como IMAP, POP3 y SMTP. De hecho, con el Port Forwarding se podra encriptar la comunicacin entre una computadora local, y un servidor de correo POP3 el cual con seguridad se encontrara ejecutando un servidor SSH al mismo tiempo.

En la actualidad existen dos tipos de Port Forwarding, el local y el remoto. En el Port Forwarding local, del que se hablar en esta documentacin, los datos que llegan a un puerto en un host local se reenvan a un puerto en un host remoto sobre un canal seguro, o "tnel". En este tipo de Port Forwarding el tnel lo crea, o lo inicia, el cliente.

Si se desea utilizar el Port Forwarding, la aplicacin cliente debe ser configurada para conectarse La a hostlocal:puertolocal enviada por en un lugar cliente de a hostremoto:puertoremoto. hostremoto:puertoremoto. informacin

hostlocal:puertlocal es interceptada por el SSH, y enviada a travs del tnel al

En la mayora de los casos, el puerto local puede ser cualquier puerto que no est siendo usado en el host local, sin embargo, el puerto remoto generalmente es un puerto "bien conocido" (3306 para MySQL).

Entorno seguro para MySQL

Pg.96de142

Programadeformacin:BASEDEDATOSMySQL

Si se presenta una situacin bastante comn y real, en la cul una aplicacin Web requiere acceso a una base de datos MySQL para su funcionamiento, el Port Forwarding puede ser bastante til.

Desde el servidor Web, o el cliente, se enva y se recibe la informacin de alguna base de datos en un servidor MySQL. Como se explic antes, est informacin que se transmite no se encuentra protegida, y por lo tanto no es confiable, ya que MySQL no cuenta con mecanismos para encriptar los datos.

Para solucionar este problema, se puede hacer uso del Secure Shell para crear un tnel entre el servidor Web y el servidor MySQL, en caso de que se tu tuviera un servidor de bases de datos MySQL ejecutndose localmente en el servidor Web. En realidad lo que sucede es que los datos que llegan al puerto 3306 en el servidor Web son enviados de forma segura al puerto 3306 en el servidor de bases de datos a travs del tnel.

Mecanismos de autenticacin en SSH

Antes de la creacin propiamente dicha del tnel se har referencia a la autenticacin de llave pblica. ste es uno de los mtodos ms seguros para autenticar cuando se utiliza el Secure Shell. En este tipo de autenticacin utiliza

Pg.97de142

Programadeformacin:BASEDEDATOSMySQL
un par de llaves generadas por computadora, una llave pblica y una privada. Cada llave normalmente posee entre 1024 y 2048 bits de longitud.

1. Ejemplo de una llave privada del tipo RSA.

-----BEGIN RSA PRIVATE KEY----MIICWQIBAAKBgQC63MxNWlknrELe6leK2ETGNKbaM2z0bSlEan7LgL+DA5lkZ x2g 1M/sc3ix42+mSVz6qvhFsNiXQWXU98lM8R9CNb67lxHD5mdcQoaiOoIC6NTzC tvV vrUaUm+p5bvdSh28VF2wD/WVboufUhLoSDh7G/BPqv5s2ZVwSs2MtKRG5QI BIwKB gCAImA1CsDKv0PMDmfqLeYEQVx4XccN/ve54qAWhCuNCfhE2P5fp98IibHZEP waQ eTWh1+6re/hWQcU4uadofeWYW8Oz7lTeyMVrP+BvnZIjakEA5ba8//4LJtWR+4 4s dvExzvHK5hhG7d0NTxzXq9V7V+CqTEuE65hatJgmrhd/m4fX3m/8b3ANPUj0C +lt tT/ +GwJBANA+xK19paFuv4IJAhCHGGcEMuJNkcdgjgCBvFP/gpOkroKmkDwKEhge ei5rGCB85+9pCEygGzNj/KKaLHRNHv8CQFVSgLbas69Wo+ +4dupZlihLLhrzEwfk

Pg.98de142

Programadeformacin:BASEDEDATOSMySQL
ZAdxHOgNdvTBKU+Jw6f2wprZbXPc16ArJEtOKo/KiJMbGNE5ceQ8VxECQE1ZJH r0 J5O7a7P0t5+9JlImIYdBYgg5zlf1hDx02Lp+/v1Tzyw+QTwok8gZJjfz4R5o1zJn Wo9uR+SfqhyRrG0CQCKgbvVgBkXr+aeg3X1nhjwzQl00gmWm53cUNTm/HW mq3v6F Yyz+8fnkEuB+jDozOFeV6cTlXpVkLSDxGwjH2R8= -----END RSA PRIVATE KEY-----

Una llave pblica es intil si no se cuenta con la correspondiente llave privada.

Para poder accesar a un servidor va SSH, use debe poner en el servidor una copia de la llave pblica. Cuando el cliente se conecta a ster, el servidor debe ofrecer su llave privada para que el acceso al mismo le sea permitido.

Como es de imaginarse, la llave privada debe ser bien protegida y debe conservarse en un lugar seguro. En este tipo de autenticacin nunca se le permite el acceso a un cliente a menos de que proporcione la "clave secreta", es decir su llave privada.

Pg.99de142

Programadeformacin:BASEDEDATOSMySQL
Lo que se har a continuacin es crear un par de llaves RSA sin passphrase para permitir que el tnel SSH pueda iniciar de forma automtica. Para hacerlo, se debe hacer lo siguiente:Welcome to the MySQL monitor.

[bingo@webserver]$ ssh-keygen -b 1024 -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/bingo/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/bingo/.ssh/id_rsa. Your public key has been saved in /home/bingo/.ssh/id_rsa.pub.

[bingo@webserver]$ scp .ssh/id_rsa.pub dbserver:

[bingo@dbserver]$ cd ~ [bingo@dbserver]$ cat id_rsa.pub >> .ssh/authorized_keys2 [bingo@dbserver]$ chmod -R go-rwx .ssh [bingo@dbserver]$ rm id_rsa.pub

Pg.100de142

Programadeformacin:BASEDEDATOSMySQL
Se verifica que se pueda acceder al servidor de bases de datos sin proporcionar un password.

[bingo@webserver]$ ssh dbserver Last login: Wed Nov 12 10:20:41 2002 bash-2.05$

No se necesita que esta conexin se mantenga abierta para que funcione el Port Forwarding, es slo para probar que nos podemos conectar va SSH al servidor de bases de datos sin proporcionar un password. Una llave privada es el medio de entrada al servidor.

bash-2.05$ exit logout Connection to dbserver closed. [bingo@webserver]$

Configuracin del Port Forwarding

Pg.101de142

Programadeformacin:BASEDEDATOSMySQL
En este momento se va a crear el tnel. El comando para abrir el tnel SSH se presenta de la siguiente forma:

[bingo@webserver]$ ssh -f -q -N -L3306:dbserver:3306 dbserver

En la tabla presentada a continuacin se presenta la descripcin de las opciones utilizadas con el comando ssh.

-f: le indica a ssh que se ejecute en segundo plano (background). -q: se utiliza para que no se muestren las advertencias y mensajes. -N: se utiliza para que ssh no permita ejecutar comandos remotos a travs de la conexin. Es til cuando se est utilizando el Port Forwarding. -L: sta es la opcin principal que hace posible el Port Forwarding local. Indica que el puerto especificado en el host local, el cliente, tiene que ser "forwardeado" (reenviado) al puerto remoto en el host remoto.

Entonces, se puede probar el acceso a alguna base de datos MySQL desde el servidor Web utilizando el tnel SSH. Podra ser necesario tener los permisos ajustados de forma correcta en MySQL para que el nombre de usuario y la contrasea que se utilicen permitan establecer la conexin a MySQL.

Pg.102de142

Programadeformacin:BASEDEDATOSMySQL
[bingo@webserver]$ mysqlshow -h 127.0.0.1 -P 3306 -u bingo -p Enter password: ********

+--------------+ | Databases | +--------------+ | agendita | apache | multimail | mysql | zoologico | test | | | | | |

+--------------+

[bingo@webserver]$ mysql -h 127.0.0.1 -P 3306 -u bingo -p zoologico Enter password: ******** 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.

Pg.103de142

Programadeformacin:BASEDEDATOSMySQL
Your MySQL connection id is 4 to server version: 3.23.41

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show tables; +---------------------+ | Tables_in_zoologico | +---------------------+ | mascotas +---------------------+ 1 row in set (0.00 sec) |

mysql> exit Bye [bingo@webserver]$

Es muy importante resaltar que se tiene que modificar el cdigo de las aplicaciones que hacen uso de MySQL desde el servidor Web, para realizar la conexin por medio del tnel SSH, en lugar de conectarse directamente al servidor de bases de datos por un canal inseguro.

Pg.104de142

Programadeformacin:BASEDEDATOSMySQL

Por ejemplo, en PHP se tendra lo siguiente:

$host = "dbserver"; $user = "bingo"; $passwd = "holahola"; $dbname = "mibase";

$conn = mysql_connect("$host","$user","$passwd"); mysql_select_db("$dbname"); ....

En principio, lo nico que se debera cambiar es la variable $host

$host = "127.0.0.1:3306"; $user = "bingo"; $passwd = "holahola"; $dbname = "mibase";

Pg.105de142

Programadeformacin:BASEDEDATOSMySQL
$conn = mysql_connect("$host","$user","$passwd"); mysql_select_db("$dbname");

En este momento, los datos que se envan y se reciben de MySQL viajarn por el tnel SSH, por lo tanto, se puede estar seguro de la confiabilidad de los datos que se trasmiten entre el servidor Web y el servidor de bases de datos MySQL. Para terminar, es importante recordar que si el tnel SSH se cae, las aplicaciones Web que lo estn utilizando no podrn acceder a las base de datos en el servidor MySQL.

Observaciones finales

No hay ningn problema si la seguridad, o la confiabilidad ofrecidas por el Port Forwarding no son suficiente, y se requiere todava hacer uso de algn firewall para proteger el servidor de bases de datos. Con esto se quiere decir que aunque el servidor MySQL se encuentre detrs de un firewall, todava puede seguir utilizndose el Port Forwarding.

Con lo nico que se debe cumplir es que en el firewall se abra el puerto 22, el puerto de Secure Shell, y de esta forma crear el tnel entre el servidor Web y el servidor de bases de datos.

Pg.106de142

Programadeformacin:BASEDEDATOSMySQL
En concreto, esta es una de las formas ms seguras con las que se puede tener trabajando una aplicacin Web distribuida. Por una lado, no se compromete la seguridad del servidor de bases de datos al ponerlo detrs de un firewall, y de esta manera protegerlo, y por otro lado, se garantiza la confiabilidad de los datos enviados desde y haca el servidor MySQL ya que stos son transmitidos a travs del tnel SSH.

UNIDAD 6: Administracin avanzada de MySQL

Objetivo de la Unidad: Emplear las instrucciones disponibles para mejorar y optimizar el rendimiento de un servidor MySQL

Pg.107de142

Programadeformacin:BASEDEDATOSMySQL

Temas: Optimizacin de Tablas y Base de datos Mostrar y administrar procesos Exportar las tablas y bases de datos a otros formatos

Optimizacin de tablas y Base de datos

Ya que el papel de MySQL ha venido creciendo en las grandes organizaciones, su uso se est convirtiendo ms y ms de alto rendimiento. Esto quiere decir que MySQL necesita poder ofrecer una mayor capacidad de respuesta, alto rendimiento, y fiabilidad. Mysql es muy conocido en la industria por ser un servidor de bases de datos increblemente rpido, es normal que MySQL se encuentre preparado para desempear su trabajo justo despus de instalarlo. Sin embargo, existen un par de aspectos que pueden fcilmente hacerlo lento, aunque no es extrao que esto se deba tambin a un pobre diseo de la aplicacin. En algunos casos la configuracin por defecto de MySQL no es lo suficientemente buena como para desempear la tarea que se desea llevar a cabo. Y otras veces se necesita tener un poco ms de hardware.

Al momento de intentar hacer ms rpida una aplicacin de bases de datos, se debe comenzar con la aplicacin en s y asegurarse de que las tablas

Pg.108de142

Programadeformacin:BASEDEDATOSMySQL
se encuentren normalizadas de forma adecuada, y las columnas se encuentren indexadas, esto es siempre un buen comienzo. Pero si ya se ha hecho todo lo anterior y las cosas siguen siendo lentas, llega el momento de echarle un ojo al servidor MySQL en s.

Aunque parezca intimidante, el ajuste del rendimiento slo trata de sacar el mayor rendimiento posible de un sistema. Para lograrlo es necesario entender cuales son las variables que se encuentran involucradas y como stas pueden afectar el buen funcionamiento del servidor.

Antes de entrar en detalle, vale la pena recordar un hecho importante: las tcnicas que se van a mostrar no arreglarn bsquedas mal escritas o sin optimizar, o un mal diseo de la base de datos, u otros problemas del diseo de la aplicacin. Puede que sirvan para aliviar el esfuerzo de un servidor ocupado, pero simplemente se est posponiendo lo inevitable. La nica solucin a una aplicacin mal escrita o un diseo pobre de la base de datos es irse al cdigo y arreglarlo. En realidad, al arreglar las consultas lentas y/o una aplicacin pobremente diseada se conseguirn mejores resultados, en lugar de perder el tiempo con el ajuste del servidor.

Si no se est seguro de por donde se debe comenzar, se tiene que habilitar el archivo de registro para las bsquedas lentas (slow query log) tal y como se explica en el manual de MySQL, y luego slo se debe observar y revisar cualquier bsqueda que no se esperaba que fuese lenta. Tambin es posible que

Pg.109de142

Programadeformacin:BASEDEDATOSMySQL
se encuentren algunas bsquedas rpidas en el archivo de las bsquedas lentas. Esto se debe a que MySQL considera cualquier bsqueda como lenta si no se utiliza un ndice.

Uso de memoria

Del lado del servidor, el nico factor y el ms importante, para determinar cmo rendir MySQL, es la memoria. MySQL es capaz de ejecutar varios subprocesos a la vez. Esto significa que cada vez que se realiza una conexin, MySQL crea un subproceso, y cada subproceso consume memoria. El almacenamiento en la cach de los resultados tambin consume memoria. Se puede pensar entonces, que entre ms memoria tengamos en el servidor, ste mejorar su desempeo. Sin embargo no es suficiente con tener mucha memoria disponible, es necesario indicarle a MySQL como queremos que utilice la memoria.

Las configuraciones por defecto de MySQL son bastante conservadoras para el hardware de hoy en da, sin embargo, si se tiene un servidor MySQL dedicado con varios cientos de mega bytes de RAM, se debe ser capaz de darle a MySQL una porcin bastante grande de ella para trabajar. Por defecto, slo se utilizar una pequea porcin de lo que se encuentre disponible; esto se debe a que no hay ninguna forma de saber si se est ejecutando en un servidor dedicado donde ser utilizado de forma continua, o si se est ejecutando en un esforzado porttil donde slo se utiliza para almacenar una pequea aplicacin.

Pg.110de142

Programadeformacin:BASEDEDATOSMySQL

Gran parte de la informacin presentada a continuacin se centrar en el uso de la memoria y se asume que se est utilizando el tipo de tabla por defecto de MySQL, MyISAM. Hoy en da existen otros tipos de tablas transaccionales ms avanzadas, tales como InnoDB o Gemini.

Ya que MySQL utiliza la memoria para una gran variedad de bfferes internos y cachs que influyen en el nmero de veces que se ha de acceder a archivos que residen en el disco, cuanto ms a menudo tenga que esperar a que responda un disco, ms lento ser. An los discos duros ms modernos siguen siendo un orden de magnitud ms lento que la memoria RAM, y dado la reciente baja en los precios de la memoria, es muy factible que se pueda aadir ms memoria al servidor y as acelerar los procesos. La ltima opcin a considerar sera actualizar el equipo con discos duros ms rpidos.

Los bfferes y cachs de MySQL son de dos tipos: globales, y por hilo.

Los globales, tal y como lo indica su nombre, son reas de memoria reservadas una vez y son compartidas a travs de todos los hilos de MySQL. Dos de los ms importantes son el bffer de claves y la cach de tablas. El objetivo es que sean lo ms grandes posibles ya que son bfferes compartidos.

Pg.111de142

Programadeformacin:BASEDEDATOSMySQL
En el caso por hilo, son bfferes que reservan memoria de forma individual a medida que necesitan realizar operaciones particulares, tales como ordenar o agrupar datos. Con respecto lo antes mencionado, la mayora de los bfferes MySQL se reservan en esta forma.

Primero se examinar que funcin tienen cada uno de los bfEn nuestro caso se hace uso de un servidor MySQL 4.013 ejecutndose en un sistema.feres y como configurar e inspeccionar sus valores, luego, se mostrar como examinar los contadores de rendimiento de MySQL y juzgar si los cambios que se realizan tienen implicaciones o no.

Bffer de claves

Este tipo de bffer es donde MySQL realiza la cach de los bloques de ndices para las tablas MyISAM. MySQL se fijar antes que nada si el ndice relevante se encuentra o no en la memoria, cada vez que una bsqueda utiliza un ndice. El parmetro key_buffer en el archivo my.cnf determina que tan grande puede ser dicho bffer. Una vez que el bffer se encuentre lleno, MySQL crear espacio para los nuevos datos reemplazando los datos antiguos que no hayan sido utilizados recientemente.

El tamao del bffer de claves aparece como key_buffer_size en la salida de SHOW VARIABLES. Con un bffer de claves 384 Mega Bytes, se vera algo como: Pg.112de142

Programadeformacin:BASEDEDATOSMySQL

key_buffer_size 402649088

Generalmente se recomienda que en un servidor MySQL dedicado se debera reservar entre el 20 y el 50 por ciento de la memoria RAM para el bffer de claves de MySQL. Si se tiene un giga byte de memoria se puede empezar con algo como:

set-variable= key_buffer= 128M

incluso:

set-variable= key_buffer= 256M

Lo primero a tomar en cuenta sera el bffer de claves, en caso de que slo se permitiera modificar un parmetro en el servidor MySQL. Tambin, los ndices son muy importantes para el rendimiento global de cualquier servidor de bases de datos, por lo que es difcil equivocarse al hacer ms espacio en su memoria para ellos.

MySQL usar su tamao por defecto que est cerca de los 8MB, si no se especifica un tamao al bffer de claves. Pero en realidad tiene muy poco

Pg.113de142

Programadeformacin:BASEDEDATOSMySQL
sentido configurar el valor del bffer de claves tan alto, al hacerlo se podra reducir el desempeo del sistema operativo con respecto a la memoria que necesita para escrituras de disco y otras tareas.

Cach de tablas

Las tablas MyISAM se componen de tres archivos en disco:

Estos son, el archivo de datos nombredetabla.MYD, el archivo ndice nombredetabla.MYI, y finalmente, el archivo de definicin de la tabla llamado nombredetabla.FRM. MySQL necesita de hecho abrir los tres archivos si desea utilizar una nica tabla. El archivo .FRM se cerrar despus de que lea el esquema, pero los dems permanecern abiertos, MySQL no los cerrar hasta que lo necesite. Si la tabla se utiliza frecuentemente, esto evita una sobrecarga asociada con la apertura y cierre de los archivos. Los archivos normalmente no se suelen cerrar hasta que ocurre uno de los siguientes eventos:

1. La tabla se ha cerrado de forma explcita mediante FLUSH TABLES. 2. La tabla se ha desechado 3. El servidor est siendo reiniciadoWelcome to the MySQL monitor. 4. El nmero total de tablas abiertas ha alcanzado el valor del parmetro table_cache

Pg.114de142

Programadeformacin:BASEDEDATOSMySQL
Este ltimo evento es importante en particular si se tienen muchas tablas que son utilizadas a menudo entre todas las bases de datos. El valor por defecto de table_cache es de 64, MySQL va a desperdiciar mucho tiempo y esfuerzo abriendo y cerrando innecesariamente estos archivos, si se tienen unos cientos de tablas que se usen de forma activa,

Al Incrementar el tamao de la cach de tablas en realidad ayudara en este caso, pero se debe tener cuidado de no hacer el valor demasiado grande, ya que todos los sistemas operativos tienen un lmite en el nmero de los archivos abiertos por un mismo proceso. De hecho, algunos tambin tienen limitado el nmero total de archivos abiertos que puede tener un nico usuario. Si MySQL intenta abrir demasiados archivos, el sistema operativo se negar a permitirlo y MySQL generar un mensaje de error en el archivo de registro de errores. Ante la duda, se tienen que comprobar las limitaciones del sistema operativo.

En los casos ms extremos, se puede incrementar el nmero de descriptores de archivos disponibles por medio de las opciones de configuracin del kernel. Los descriptores de archivos abiertos se encuentran reservados por un nico proceso, y compartidos por todos sus hilos. A diferencia de los muchos otros parmetros, la cach de tablas se aplica a todos los tipos de tablas basadas en disco de MySQL.

Bffer de registro

Pg.115de142

Programadeformacin:BASEDEDATOSMySQL

Siempre que MySQL deba escanear una tabla, el hilo que realiza el escaneo reservar un bffer de registro para cada tabla que se deba escanear. Esto sucede normalmente cuando MySQL decide que es ms eficiente escanear la tabla que utilizar un ndice para una bsqueda. Tambin ocurre cuando simplemente no hay un ndice que se pueda utilizar.

Al incrementar el valor de record_buffer en el archivo my.cnf, se permite que MySQL lea las tablas en pedazos ms grandes. Es probable que esto reduzca el nmero de bsquedas en el disco y haga que el escaneo sea significativamente ms rpido en un servidor muy atareado.

Sin embargo, se debe que ser muy cuidadoso con el bffer de registro si se tienen muchos clientes que realizan bsquedas completas sobre tablas. Debido a que el bffer de registro se reserva por cada hilo, se puede acabar en una situacin donde clientes individuales hagan que se reserven bfferes de registro al mismo tiempo. Si el resto de la memoria est limitada es probable que se empiece a hacer uso de la memoria de intercambio y el rendimiento se ver dramticamente reducido. En la versin 3.23.41 se introdujo un parmetro relacionado denominado record_rnd_buffer.

Al igual que record_buffer, se utiliza para escanear un gran nmero de filas. El record_rnd_buffer se utiliza para realizar las bsquedas que resultan en una ordenacin intermedia del archivo, adems de algunas lecturas de registro

Pg.116de142

Programadeformacin:BASEDEDATOSMySQL
no secuenciales. Afortunadamente, si no se fija el valor de record_rnd_buffer se establecer por defecto el valor de record_buffer.

Bffer de ordenacin

Tal y como lo indica su nombre, el bffer de ordenacin se utiliza para responder a las bsquedas que involucran el ordenamiento de los datos, aquellas que contengan una sentencia ORDER BY. Adems, el bffer de ordenacin se se utiliza para las bsquedas que involucran el agrupamiento de datos, aquellas con una sentencia GROUP BY. Como con los dems tipos de bfferes vistos hasta ahora, el bffer de ordenacin es relativamente pequeo por defecto. Al ajustar la entrada de sort_buffer en el archivo my.cnf:

set-variable= sort_buffer= 8M

Se puede reducir la cantidad de tiempo que se consume para ordenar grandes grupos de resultados. El bffer de ordenacin aparece como sort_buffer en la salida de SHOW VARIABLES, por ejemplo:

sort_buffer 8388600

El tipo de aviso que se aplica al bffer de ordenacin se aplica al bffer de registros. Es un bffer que MySQL reserva normalmente por hilo. As que, hay Pg.117de142

Programadeformacin:BASEDEDATOSMySQL
que incrementarlo con cuidado en un servidor que ejecute muchas bsquedas concurrentes.

Pautas generales de ajuste

Antes de entrar en la discusin sobre como medir o juzgar los efectos de cualquier cambio que se lleve a cabo, se debe considerar brevemente un acercamiento a la afinacin del rendimiento. Existen varios aspectos que se deben tener en cuenta cuando se empiezan hacer y probar cambios:

1. Slo se debe cambiar un parmetro cada vez. Puede que los cambios no resulten siempre en el comportamiento esperado. Si se cambian demasiados parmetros a la vez, se corre el riesgo de asignar un cambio en el comportamiento al parmetro equivocado. 2. No hacer cambios en sistemas en produccin. Si es del todo posible, se debe tener un servidor de pruebas disponible que sea parecido en naturaleza al servidor de bases de datos de produccin. Si se hacen cambios en la configuracin de MySQL seguramente requerir que se pare y reinicie el servidor, lo que har que los usuarios experimenten interrupciones en el mismo. 3. Utilizar datos reales. El tipo de datos que se estn utilizando afecta la respuesta de MySQL con respecto a las bsquedas. Sera ideal que se utilice una copia de las bases de datos de produccin. Si no es posible hacerlo, entonces se debera intentar construir un subconjunto representativo de datos.

Pg.118de142

Programadeformacin:BASEDEDATOSMySQL
4. Realizar pruebas realistas. Es fcil asumir que se sabe que pruebas aplicar slo por el hecho de que se sabe cuales son las reas problemticas. Sin embargo, algunos cambios de la configuracin aceleran las partes lentas de una aplicacin al mismo tiempo que disminuyen la velocidad de las cosas que antes eran bastante rpidas. 5. Ser sistemtico y registrar descubrimientos. Es importante que se mantenga la pista de los cambios que se realizan y como afectan al rendimiento. Despus de varias horas, o incluso das de pruebas, es ms que probable que no se recuerde exactamente que es lo que se ha cambiado y si los cambios fueron positivos o negativos.

Observando los nmeros de rendimiento de la base de datos

Al contar con pocos puntos de partida y un concepto de cmo hacer pruebas, se debe ahora considerar cmo darle seguimiento al progreso. Afortunadamente, MySQL cuenta con ms de 50 contadores internos, o variables de estado, que mantienen el seguimiento sobre cuntas veces ocurren diferentes tipos de eventos.

En el manual de MySQL se describen todas y cada de las variables de estado de MySQL en mayor detalle. Para ver estos nmeros, se puede utilizar la sentencia SHOW STATUS. En este caso se mencionan slo las variables relacionadas con el bffer de claves:

Pg.119de142

Programadeformacin:BASEDEDATOSMySQL
SHOW STATUS LIKE 'Key%'

Key_read_requests 3844786889 key_reads 16525182 Key_write_requests 303516563 Key_writes 152315649

Gracias a estas cuatro variables se puede ver el rendimiento del bffer de claves de MySQL. Cada vez que MySQL sea capaz de leer una clave, o ndice, del bffer de claves, en lugar de ir al disco, se incrementar el valor de key_read_requests de forma automtica. Si MySQL debe leer la clave del disco porque no se encontraba en la cach, se incrementar key_reads. La misma lgica se aplica para las escrituras de disco. Teniendo esto en cuenta, se puede calcular la eficiencia, o hit rate, para el bffer de claves.

Al utilizar una frmula como: 100 - ((Key_reads / Key_read_requests) * 100)

se puede obtener un porcentaje que representa cmo Mysql es capaz de leer las claves directamente de la cach, en vez de irse a disco. Cuanto ms cerca ese encuentre el valor a 100, mucho mejor. Al utilizar los nmeros antes presentados, se tiene un hit rate de cerca del 99.57 por ciento. En general, suele ser una buena idea mantener este porcentaje por encima del 90 por ciento. A fin Pg.120de142

Programadeformacin:BASEDEDATOSMySQL
de cuentas, de lo que se trata, es de tener una mejora medible del rendimiento de MySQL.

Al observar los nmeros de rendimiento del sistema, monitorear los cambios de rendimiento en MySQL se vuelve slo una parte del trabajo, tambin es necesario ver qu es lo que est pasando desde el punto de vista del sistema operativo, ya que como cualquier otra aplicacin, se encuentra sometida a lo que el sistema operativo quiera permitirle hacer, as que es importante que se mantenga una vista global sobre toda la actividad del sistema operativo.

Antes de comenzar a realizar las pruebas, se debe tener una idea de la actividad actual del sistema y de las caractersticas del rendimiento de MySQL. Si no se cuenta con una base para la comparacin, en realidad no se sabr como ha cambiado el impacto de MySQL en el sistema. Finalmente, cabe mencionar que nicamente se ha descrito una mnima parte de lo que representa el rendimiento en el lado del servidor para MySQL. El manual de MySQL contiene muchas otras ideas sobre cmo incrementar el rendimiento de MySQL y darle seguimiento los progresos.

Mostrar y administrar procesos

Pg.121de142

Programadeformacin:BASEDEDATOSMySQL
Con SHOW PROCESSLIST se muestra qu procesos se encuentran en curso. Tambin se puede obtener esta informacin al utilizar el comando mysqladmin processlist. Si se cuenta con el privilegio SUPER, se podrn ver todos los procesos. De lo contrario, slo ser posible ver los propios procesos, es decir, los procesos asociados con la cuenta MySQL que se est utilizando. Ver la sintaxis de KILL. Al no utilizar la palabra clave FULL, slo se muestran los 100 primeros caracteres de cada consulta.

Desde la versin de MySQL 4.0.12, la sentencia informa sobre el nombre de la mquina para conexiones TCP/IP que utiliza el formato host_name:client_port para hacer ms fcil poder determinar qu cliente est haciendo cada cosa.

Esta sentencia es muy prctica si se obtiene el mensaje de error "too many connections" y se quiere averiguar qu est ocurriendo. MySQL se reserva una conexin extra para ser utilizada por las cuentas que tengan el privilegio SUPER, para de esta forma asegurar que los administradores siempre tendrn la posibilidad de conectar y verificar el sistema, asumiendo que no se ha dado tal privilegio a todos los usuarios.

Algunos estados frecuentes en la salida de SHOW PROCESSLIST son: Checking table: el proceso est realizando una comprobacin, automtica, de la tabla.

Pg.122de142

Programadeformacin:BASEDEDATOSMySQL
Closing tables: significa que el proceso est enviando los datos modificados de la tabla al disco y cerrando las tablas utilizadas. Esto debe ser una operacin rpida, en caso contrario, se debe verificar que el disco no se encuentre lleno y que el disco no est siendo muy utilizado. Connect Out: es el esclavo conectando al maestro. Copying to tmp table on disk: es el conjunto de resultados temporales que son ms grandes que tmp_table_size y el proceso est cambiando la tabla temporal del formato en memoria al basado en disco, para ahorrar memoria. Creating tmp table: el proceso est creando una tabla temporal para almacenar una parte del resultado de una consulta. deleting from main table: el servidor est ejecutando la primera parte de un borrado multitabla y borrando slo desde la primera tabla. deleting from reference tables: el servidor se encuentra ejecutando la segunda parte de un borrado multitabla y eliminando las filas coincidentes de otras tablas. Flushing tables: el proceso se encuentra ejecutando FLUSH TABLES y esperando a que todos los procesos cierren sus tablas. Killed: alguien ha enviado un 'kill' al proceso y se abortar la prxima vez que verifique la marca de 'kill'. La marca se verifica en cada bucle exterior en MySQL, pero en algunos casos podr requerir un pequeo tiempo para que el proceso se elimine. Si el proceso est bloqueado por otro, la finalizacin tendr efecto tan pronto como el otro proceso retire el bloqueo. Locked: la consulta est bloqueada por otra consulta.

Pg.123de142

Programadeformacin:BASEDEDATOSMySQL
Sending data: esta procesando filas para una sentencia SELECT y tambin est enviando datos al cliente. Sorting for group: el proceso est haciendo un ordenamiento para satisfacer un GROUP BY. Sorting for order: el proceso est haciendo un ordenamiento para satisfacer un ORDER BY. Opening tables: el proceso est intentado abrir una tabla. Este debe ser un procedimiento muy rpido, a no ser que algo impida la apertura. Por ejemplo, una sentencia ALTER TABLE o una sentencia LOCK TABLES pueden impedir la apertura de una tabla hasta que la sentencia haya terminado. Removing duplicates: la consulta ha usado SELECT DISTINCT de tal modo que MySQL no puede optimizar la operacin de distincin en una primera etapa. Debido a esto, MySQL necesita una etapa extra para eliminar todas las filas duplicadas antes de enviar el resultado al cliente. Reopen table: el proceso ha obtenido un bloqueo para la tabla, pero se ha notificado que despus de obtenerlo la estructura de la tabla ha cambiado. Ha liberado el bloqueo, cerrado la tabla y ahora est intentando reabrirla. Repair by sorting: el cdigo de reparado est utilizando un ordenamiento para crear los ndices. Repair with keycache: el cdigo de reparado se encuentra utilizando la creacin de claves una a una a travs del cach de claves. Esto es mucho ms lento que 'Repair by sorting'. Searching rows for update: el proceso se encuentra ejecutando una primera fase para encontrar todas las filas coincidentes antes de actualizarlas. Esto tiene Pg.124de142

Programadeformacin:BASEDEDATOSMySQL
que hacerse si el UPDATE est modificando el ndice que se utiliza para encontrar las filas involucradas. Sleeping: el proceso est esperando a que el cliente le enve una nueva sentencia. System lock: el proceso se encuentra esperando obtener un bloque de sistema externo para la tabla. Si no se estn utilizando varios servidores mysqld que estn accediendo a las mismas tablas, se pueden desactivar los bloqueos de sistema con la opcin --skip-external-locking. Upgrading lock: el manipulador de INSERT DELAYED est intentando obtener un bloqueo para la tabla para insertar filas. Updating: el proceso est buscando filas para actualizar. User Lock: el proceso est esperando un GET_LOCK(). Waiting for tables: el proceso tiene una notificacin de que la estructura para una tabla subyacente ha cambiado y necesita reabrir la tabla para obtener la nueva estructura. Sin embargo, para que pueda reabrir la tabla, se debe esperar hasta que otros procesos hayan cerrado la tabla en cuestin. Esta notificacin se produce si otro proceso ha usado FLUSH TABLES o una de las siguientes sentencias para la tabla en cuestin: FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE u OPTIMIZE TABLE. waiting for handler insert: El manipulador de INSERT DELAYED ha procesado todas las inserciones pendientes y est esperando por ms.

Pg.125de142

Programadeformacin:BASEDEDATOSMySQL
Gran parte de estos estados se corresponden con operaciones muy rpidas. Si un proceso permanece en cualquiera de esos estados por muchos segundos, probablemente existe un problema que necesita ser investigado.

Existen otros estados que no se mencionan en la lista anterior, pero muchos de ellos son tiles slo para encontrar bugs (errores) en el servidor.

Si se desea cancelar algn proceso, se debe usar la instruccin KILL

KILL thread_id

Cada conexin a mysqld se ejecuta en un hilo separado. Se puede ver qu hilo se est ejecutando con el comando SHOW PROCESSLIST y eliminarlo con el comando KILL thread_id.

Si se cuenta con un privilegio PROCESS, se pueden ver todos los hilos. Si se posee el privilegio SUPER, se pueden matar todos los hilos. En otro caso, slo es posible ver y eliminar los hilos propios.

Tambin

se

pueden

usar

los

comandos

mysqladmin

processlist

mysqladmin kill par examinar y matar hilos.

Pg.126de142

Programadeformacin:BASEDEDATOSMySQL
Nota: en la actualidad no se puede utilizar el comando KILL con la librera del Servidor MySQL embebido, porque el servidor embebido simplemente se ejecuta dentro de los hilos en el ordenador de la aplicacin, no crea hilos de conexiones por s mismo. Al realizar un KILL, se activa un bandern de 'kill' especfico para el hilo.

En la mayora de los casos, eliminar el hilo puede tomar un tiempo ya que el flag 'kill' se verifica slo cada cierto tiempo.

El bucle ORDER BY y GROUP BY del comando SELECT, el bandern se comprueba despus de leer un bloque de filas. Si el bandern de 'kill' est activot, la sentencia se aborta. Al realizar un ALTER TABLE, el bandern 'kill' se comprueba antes de que cada bloque de filas se lea desde la tabla original. Si est activo el comando se aborta y la tabla temporal se borra. Al ejecutar las sentencias UPDATE o DELETE, el bandern se comprueba despus de cada lectura de bloque y despus de cada actualizacin o borrado de fila. Si se encuentra activo, la sentencia se aborta. Si no se estn utilizando las transacciones, los cambios no podrn ser rebobinados. GET_LOCK() abortar con NULL. Un hilo INSERT DELAYED almacenar rpidamente todas las filas que tenga en memoria y morir.

Pg.127de142

Programadeformacin:BASEDEDATOSMySQL
Si el hilo se encuentra en la tabla de manipuladores de bloqueo (estado: Locked), el bloqueo de la tabla ser rpidamente abortado. Si el hilo se encuentra esperando a que haya espacio libre en disco en una llamada de escritura, la escritura se aborta con un mensaje de error de disco lleno.

Exportar las tablas y base de datos a otros formatos

Con MySQL se pueden copiar las tablas en diferentes formatos de texto, as como importar datos a partir de un archivo de texto en diferentes formatos. Esto se puede utilizar para exportar los datos de nuestras bases de datos a otras aplicaciones, o bien para importar datos desde otras fuentes a nuestras tablas. Tambin se puede utilizar para hacer copias de seguridad y restaurarlas posteriormente.

Exportar a otros archivos.

Para extraer los datos desde una base de datos a un archivo se usa la sentencia SELECT ... INTO OUTFILE.

El resto de las clusulas de SELECT siguen siendo aplicables, la nica diferencia es que la salida de la seleccin se enva a un archivo en lugar de hacerlo a la consola.

Pg.128de142

Programadeformacin:BASEDEDATOSMySQL

La sintaxis de la parte INTO OUTFILE es:

[INTO OUTFILE 'file_name' export_options]

file_name es el nombre del archivo de salida. ste no debe existir, ya que en caso contrario la sentencia fallar.

En lo que respecta a las opciones de exportacin, son las mismas que para las clusulas FIELDS y LINES de LOAD DATA. Su sintaxis es:

[FIELDS [TERMINATED BY '\t'] [[OPTIONALLY] ENCLOSED BY ''] [ESCAPED BY '\\' ] ] [LINES [STARTING BY ''] [TERMINATED BY '\n'] ]

Pg.129de142

Programadeformacin:BASEDEDATOSMySQL
Estas clusulas permiten la creacin de diferentes formatos de archivos de salida.

La clusula FIELDS se refiere a las opciones de cada columna:

TERMINATED BY 'caracter': nos permite elegir el caracter delimitador que se utilizar para seleccionar cada columna. Por defecto, el valor que se usa es el tabulador, pero podemos usar ';', ',', etc. [OPTIONALLY] ENCLOSED BY 'caracter': sirve para elegir el caracter utilizado para entrecomillar cada columna. Por defecto no se entrecomilla ninguna columna, pero se puede elegir cualquier caracter. Si se aade la palabra OPTIONALLY slo se entrecomillarn las columnas de texto y fecha. ESCAPED BY 'caracter': sirve para indicar el caracter que se utilizar para escapar de aquellos caracteres que pueden dificultar la lectura posterior del archivo. Por ejemplo, si se terminan las columnas con ',' y no se entrecomillan, un caracter ',' dentro de una columna de texto se interpretar como un separador de columnas. Para evitar que esto suceda se puede sustituir esa coma con otro caracter. Por defecto se usa el caracter '\'.

La clusula LINES se refiere a las opciones para cada fila:

STARTING BY 'caracter': permite seleccionar el caracter para comenzar cada lnea. Por defecto no se usa ningn caracter para ello.

Pg.130de142

Programadeformacin:BASEDEDATOSMySQL
TERMINATED BY 'caracter': permite elegir el caracter para terminar cada lnea. Por defecto es el retorno de lnea, pero se puede usar cualquier otro caracter o caracteres, por ejemplo '\r\n'.

Si se desea obtener un fichero de texto a partir de la tabla 'gente', con las columnas delimitadas por ';', entrecomillando las columnas de texto con '"' y separando cada fila por la secuencia '\r\n', se utilizar la sentencia presentada a continuacin:

mysql> SELECT * FROM gente -> INTO OUTFILE "gente.txt" -> FIELDS TERMINATED BY ';' -> OPTIONALLY ENCLOSED BY '\"' -> LINES TERMINATED BY '\n\r'; Query OK, 5 rows affected (0.00 sec)

mysql>

El archivo de salida se ver de la siguiente forma:

"Fulano";"1974-04-12"

Pg.131de142

Programadeformacin:BASEDEDATOSMySQL
"Mengano";"1978-06-15" "Tulano";"2000-12-02" "Pegano";"1993-02-10" "Mengano";\N

La fecha para "Mengano" era NULL, para indicarlo se muestra el valor \N.

Pg.132de142

Programadeformacin:BASEDEDATOSMySQL

UNIDAD 7: Migracin a MySQL

Objetivo de la Unidad: Utilizar los mtodos a seguir para importar informacin de otros gestores de bases de datos a MySQL.

Temas: Importacin desde Microsoft SQL Server Importacin desde Microsoft Access Pg.133de142

Programadeformacin:BASEDEDATOSMySQL
Otras bases de datos u otras tcnicas Importacin desde archivos CSV, TXT y otros formatos de texto plano

El caso ms extremo con el que se puede encontrar a la hora de subir una base de datos a nuestro proveedor de alojamiento, es que la base de datos la tengamos creada de forma local, pero en un sistema gestor distinto del que vamos a utilizar en remoto. Si se piensa en remoto, se supone siempre que se va a utilizar la base de datos MySQL. En Si se piensa en local, se puede disponer de una base de datos Access, SQL Server o de otro sistema de base de datos.

El proceso de migracin puede ser bastante complejo y, ya que existen tantas bases de datos distintas, es difcil de encontrar una receta que funcione en todos los casos. Por otro lado, aparte de la dificultad de transferir la informacin entre los dos sistemas gestores de base de datos, tambin influye mucho en la complejidad del problema, el tipo de los datos de las tablas que se estn utilizando. Por ejemplo, las fechas, los campos numricos con decimales o los boleanos pueden dar problemas al pasar de un sistema a otro, porque pueden almacenarse de maneras distintas o, en el caso de los nmeros, con una precisin distinta.

Recomendaciones para migrar desde SQL Server a MySQL

Pg.134de142

Programadeformacin:BASEDEDATOSMySQL
En realidad es muy difcil encontrarse con este caso, pero se debe decir que Access tambin puede ayudar con respecto a este asunto. Access permite seleccionar una base de datos SQL Server y trabajar desde la propia interfaz del programa. La idea es que Access tambin permite trabajar con MySQL y posiblemente al crear un puente entre estos dos sistemas gestores se pueden exportar los datos de SQL Server a MySQL.

Lo que si es cierto es que al utilizar el propio Access como puente se podra realizar el trabajo. Primero exportando de SQL Server a Acess y luego desde Access a MySQL.

Recomendaciones para migrar de Access a MySQL

Si la base de datos anterior se encontraba construida en Access el proceso resulta muy fcil, debido a que MySQL dispone de un driver ODBC para sistemas Windows, que permite conectar Access con el propio MySQL y pasar informacin de forma fcil.

Este tema se trata en ms detalle el artculo sobe Exportar datos de MySQL a Access, aunque se debe sealar que si se desea hacer una exportacin desde Access en local hacia MySQL en remoto, pueden surgir problemas ya que

Pg.135de142

Programadeformacin:BASEDEDATOSMySQL
no todos los alojadores permiten las conexiones en remoto con la base de datos. Si no se dispone de una conexin en remoto con nuestro servidor de bases de datos se debe cambiar la estrategia un poco.

En este ltimo caso se podra instalar MySQL en local y realizar la migracin desde Access en local a MySQL en local, y luego se podra hacer un backup de la base de datos local y subirla a remoto, tal y como se mencion antes.

Otras bases de datos u otras tcnicas

Si la base de datos origen cuanta con un driver ODBC, en teora, no se tendra ningn problema para conectarla con Access, igual a como se conecta con MySQL. Entonces se podra utilizar Access para exportar los datos, ya que desde all se podran acceder a los dos sistemas gestores de bases de datos.

Si no se cuenta con Access, o la base de datos original no tiene driver ODBC, o bien el proceso no funciona de la forma correcta y no se sabe cmo arreglarlo, otra posibilidad es exportar los datos a archivos de texto, separados por comas o algo parecido. Muchas bases de datos tienen herramientas para exportar los datos de las tablas hacia archivos de texto, los cuales luego pueden ser introducidos en el sistema gestor destino (MySQL) con la ayuda de alguna herramienta como PhpMyAdmin.

Pg.136de142

Programadeformacin:BASEDEDATOSMySQL

Para lograrlo, en la pgina de propiedades de la tabla se encuentra una opcin para hacer el backup de la tabla y para introducir los archivos de texto dentro de una tabla (Insert textfiles into table en ingls).

Al acceder a ese enlace se puede ver un formulario donde introducir las caractersticas del archivo de texto, como el caracter utilizado como separador de campos, o el terminador de lneas, etc., junto con el propio archivo con los datos, y el PhpMyAdmin se encargar del trabajo de incluir esos datos en la tabla.

Como es de suponerse, es necesario tener creada la tabla en remoto para poder introducirle los datos del archivo de texto.

En especial, toda la migracin tiene que tener en cuenta, como se mencion antes, las formas que cada base de datos tenga para guardar la informacin, es decir, del formato de sus tipos de datos. Siempre se debe contar con la posible necesidad de transformar algunos datos como pueden ser los campos boleanos, fechas, campos memo, un texto con longitud indeterminada, etc., los cuales pueden ser almacenados de maneras distintas en cada uno de los sistemas gestores, origen y destino.

Pg.137de142

Programadeformacin:BASEDEDATOSMySQL
En algunos casos es posible que se tenga que realizar algn script que lleve a cabo los cambios necesarios en los datos. Por ejemplo, se puede llevar a cabo para localizar los valores boleanos guardados como true / false a valores enteros 0 / 1, que es como se guardan en MySQL. Tambin, las fechas pueden sufrir cambios de formato, mientras que en Access aparecen en castellano (dd/mm/aaaa) en MySQL aparecen en el formato aaaa-mm-dd. PHP puede ayudar en la tarea de hacer este script, tambin Visual Basic Script para Access puede hacer estas tareas complejas y el propio lenguaje SQL, a base de sentencias dirigidas contra la base de datos, puede servir para algunas acciones sencillas.

Importacin desde archivos CSV, TXT y otros formatos de texto plano

Se tiene la posibilidad de leer el contenido de un archivo de texto en una tabla. El archivo origen puede haber sido creado mediante una sentencia SELECT ... INTO OUTFILE, o mediante cualquier otro medio.

Para hacerlo se cuenta con la sentencia LOAD DATA, cuya sintaxis ms simple es:

LOAD DATA [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE]

Pg.138de142

Programadeformacin:BASEDEDATOSMySQL
INTO TABLE tbl_name [FIELDS [TERMINATED BY '\t'] [[OPTIONALLY] ENCLOSED BY ''] [ESCAPED BY '\\' ] ] [LINES [STARTING BY ''] [TERMINATED BY '\n'] ] [IGNORE number LINES] [(col_name,...)]

La clusula LOCAL indica, si aparece, que el archivo se encuentra en el ordenador del cliente. Al no especificar el archivo de texto se buscar en el servidor, concretamente en el mismo directorio donde se encuentre la base de datos. Esto nos permite importar datos desde el ordenador, en un sistema en que el servidor de MySQL se encuentra en otra mquina.

Las clusulas REPLACE e IGNORE afectan la forma en que se tratan las filas ledas que contengan el mismo valor para una clave principal o nica para una

Pg.139de142

Programadeformacin:BASEDEDATOSMySQL
fila existente en la tabla. Si se especifica REPLACE se sustituir la fila actual por la leda. Al especificar IGNORE el valor ledo ser ignorado.

La parte INTO TABLA tbl_name indica en las tablas donde se insertarn los valores ledos. No se comenta mucho sobre las clusulas FIELDS y LINES ya que su significado es el mismo que vimos para la sentencia SELECT ... INTO OUTFILE. Estas sentencias nos permiten interpretar correctamente cada fila y cada columna, adaptndose al formato del archivo de texto de entrada.

La clusula IGNORE nmero LINES tiene el mismo uso, el cual nos permite que las primeras lneas no se interpreten como datos a importar. Es frecuente que los archivos de texto que se utilizarn como fuente de datos contengan algunas cabeceras que expliquen el contenido del archivo, o que contengan los nombres de cada columna. Al utilizar esta clusula se pueden ignorar.

Esta ltima parte permite indicar la columna a la que ser asignada cada una de las columnas ledas, esto ser til si el orden de las columnas en la tabla no es el mismo que en el archivo de texto, o si el nmero de columnas es diferente en ambos casos.

Por ejemplo, supngase que se desea aadir el contenido de este archivo a la tabla "gente":

Pg.140de142

Programadeformacin:BASEDEDATOSMySQL
Archivo de datos de "gente" fecha,nombre 2004-03-15,Xulana 2000-09-09,Con Clase 1998-04-15,Pingrana

Como se puede observar, existen dos filas al principio que no contienen datos vlidos, las columnas se encuentran separadas por comas y, como se ha editado el archivo con el "notepad", las lneas terminan con "\n\r". A continaucin se presenta la sentencia adecuada para leer los datos:

mysql> LOAD DATA INFILE "gente.txt" -> INTO TABLE gente -> FIELDS TERMINATED BY ',' -> LINES TERMINATED BY '\r\n' -> IGNORE 2 LINES -> (fecha,nombre); Query OK, 3 rows affected (0.00 sec) Records: 3 Deleted: 0 Skipped: 0 Warnings: 0

mysql>

Pg.141de142

Programadeformacin:BASEDEDATOSMySQL

El nuevo contenido de la tabla es:

mysql> SELECT * FROM gente; +-----------+------------+ | nombre | fecha |

+-----------+------------+ | Fulano | 1974-04-12 |

| Mengano | 1978-06-15 | | Tulano | Pegano | 2000-12-02 | | 1993-02-10 | |

| Mengano | NULL | Xulana

| 2004-03-15 |

| Con Clase | 2000-09-09 | | Pingrana | 1998-04-15 | +-----------+------------+ 8 rows in set (0.00 sec) mysql>

Pg.142de142

Вам также может понравиться