Trabajar don datos en MySQL Cluster no es muy distinto que trabajar con MySQL sin Cluster. Hay que tener en cuenta dos puntos al hacerlo:
Las tablas deben crearse con la opción
ENGINE=NDB
o
ENGINE=NDBCLUSTER
, o cambiarse (mediante
ALTER TABLE
) para usar el motor NDB
CLuster para que puedan replicarse en el cluster. Si está
importando tablas de una base de datos existente usando la
salida de mysqldump, puede abrir el
script SQL en un editor de texto y añadir está opción a
cualquier comando de creación de tablas, o reemplazar
cualquier opción ENGINE
(o
TYPE
) existente con alguna de estas. Por
ejemplo, suponga que tiene la base de datos de ejemplo
world
en otro MySQL server (que no
soporta MySQL Cluster), y desea exportar la definición de
la tabla City
:
shell> mysqldump --add-drop-table world City > city_table.sql
El fichero city_table.sql
resultante
contendrá el comando de creación de la tabla ( y el
comando INSERT
necesario para importar
los datos de la tabla):
DROP TABLE IF EXISTS City; CREATE TABLE City ( ID int(11) NOT NULL auto_increment, Name char(35) NOT NULL default '', CountryCode char(3) NOT NULL default '', District char(20) NOT NULL default '', Population int(11) NOT NULL default '0', PRIMARY KEY (ID) ) TYPE=MyISAM; INSERT INTO City VALUES (1,'Kabul','AFG','Kabol',1780000); INSERT INTO City VALUES (2,'Qandahar','AFG','Qandahar',237500); INSERT INTO City VALUES (3,'Herat','AFG','Herat',186800); # (remaining INSERT statements omitted)
Necesitará asegurarse que MySQL usa el motor NDB para esta
tabla. Hay dos formas de hacerlo. Una es,
antes de importar la tabla
en la base de datos del cluster, modificar su definición
para que lea (usando City
como ejemplo):
DROP TABLE IF EXISTS City; CREATE TABLE City ( ID int(11) NOT NULL auto_increment, Name char(35) NOT NULL default '', CountryCode char(3) NOT NULL default '', District char(20) NOT NULL default '', Population int(11) NOT NULL default '0', PRIMARY KEY (ID) ) ENGINE=NDBCLUSTER; INSERT INTO City VALUES (1,'Kabul','AFG','Kabol',1780000); INSERT INTO City VALUES (2,'Qandahar','AFG','Qandahar',237500); INSERT INTO City VALUES (3,'Herat','AFG','Herat',186800); # (etc.)
Esto debe hacerse para la definición de cada tabla que
será parte de la base de datos clusterizada. La forma más
fácil de hacerlo es símplemente hacer un buscar y
reemplazar en el fichero world.sql
y
reemplazar todas las instancias de
TYPE=MyISAM
con
ENGINE=NDBCLUSTER
. Si no quiere modificar
el fichero, puede usar ALTER TABLE
;
consulte a continuación las particularidades.
Asumiendo que ha creado la base de datos llamada
world
en el nodo SQL del cluster, puede
usar el cliente de línea de comandos
mysql para leer
city_table.sql
, y crear y llenar de
datos la tabla correspondiente de la forma usual:
shell> mysql world < city_table.sql
Es muy importante recordar que el comando anterior debe ejecutarse en la máquina en que corre el nodo SQL -- en este caso, la máquina con dirección IP 192.168.0.20.
Para crear una copia de la base de datos
world
en el nodo SQL, guarde el fichero
en /usr/local/mysql/data
, luego ejecute
shell> cd /usr/local/mysql/data shell> mysql world < world.sql
Por supuesto, el script SQL debe ser leíble por el usuario
mysql
. Si guarda el fichero en un lugar
distinto, ajuste lo anterior correctamente.
Es importante tener en cuenta que NDB Cluster en MySQL 5.0
no soporta descubrimiento automático de bases de datos.
(Consulte Sección 16.8, “Limitaciones conocidas de MySQL Cluster”.) Esto
significa que , una vez que la base de datos
world
y sus tablas se han creado en un
nodo de datos, necesitará ejecutar el comando
CREATE DATABASE world; (a partir de MySQL
5.0.2, puede usar CREATE SCHEMA world; en
su lugar), seguido por FLUSH TABLES; en
cada nodo de datos del cluster. Esto hará que el nodo
reconozca la base de datos y lea sus definiciones de tablas.
Ejecutar consultas SELECT en el nodo SQL no es distinto a ejecutarlas en cualquier otra instancia de un MySQL server. Para ejecutar consultas de línea de comandos, primero necesita registrarse en el MySQL Monitor normalmente:
shell> mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 to server version: 4.1.9-max Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql>
Si no modifica las cláusulas ENGINE=
en
las definiciones de tabla antes de importar el script SQL,
debe ejecutar los siguientes comandos en este punto:
mysql> USE world; mysql> ALTER TABLE City ENGINE=NDBCLUSTER; mysql> ALTER TABLE Country ENGINE=NDBCLUSTER; mysql> ALTER TABLE CountryLanguage ENGINE=NDBCLUSTER;
Tenga en cuenta que símplemente usamos la cuenta
root
por defecto del sistema con una
contraseña vacía. Por supuesto, en un sistema de
producción, debe siempre
seguir las precauciones de seguridad para instalar un MySQL
server, incluyendo una contraseña de root y la creación de
una cuenta de usuario con sólo los permisos necesarios para
realizar las tareas necesarias para ese usuario. Para más
información acerca de esto, consulte
Sección 5.6, “El sistema de privilegios de acceso de MySQL”.
Vale la pena tener en cuenta que los nodos del cluster no
utilizan el sistema de permisos de MySQL al acceder el uno
al otro, y preparar o cambiar las cuentas de usuario de
MySQL (incluyendo la cuenta root
) no
tiene efecto en la interacción entre nodos, sólo en
aplicaciones accediendo al nodo SQL.
Seleccionar una base de datos y ejecutar una consulta SELECT contra una tabla en la base de datos se realiza de la forma normal, como salir del MySQL Monitor:
mysql> USE world; mysql> SELECT Name, Population FROM City ORDER BY Population DESC LIMIT 5; +-----------+------------+ | Name | Population | +-----------+------------+ | Bombay | 10500000 | | Seoul | 9981619 | | São Paulo | 9968485 | | Shanghai | 9696300 | | Jakarta | 9604900 | +-----------+------------+ 5 rows in set (0.34 sec) mysql> \q Bye shell>
Las aplicaciones usando MySQL pueden usar APIs estándar. Es
importante recordar que sus aplicaciones deben acceder al
nodo SQL, y no al nodo MGM o a los de almacenamiento. Este
breve ejemplo muestra cómo puede ejecutar la misma consulta
que la anterior usando la extensión de PHP 5
mysqli
ejecutando un servidor web en
cualquier punto de la red:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <title>SIMPLE mysqli SELECT</title> </head> <body> <?php # connect to SQL node: $link = new mysqli('192.168.0.20', 'root', '', 'world'); # parameters for mysqli constructor are: # host, user, password, database if( mysqli_connect_errno() ) die("Connect failed: " . mysqli_connect_error()); $query = "SELECT Name, Population FROM City ORDER BY Population DESC LIMIT 5"; # if no errors... if( $result = $link->query($query) ) { ?> <table border="1" width="40%" cellpadding="4" cellspacing ="1"> <tbody> <tr> <th width="10%">City</th> <th>Population</th> </tr> <? # then display the results... while($row = $result->fetch_object()) printf(<tr>\n <td align=\"center\">%s</td><td>%d</td>\n</tr>\n", $row->Name, $row->Population); ?> </tbody </table> <? # ...and verify the number of rows that were retrieved printf("<p>Affected rows: %d</p>\n", $link->affected_rows); } else # otherwise, tell us what went wrong echo mysqli_error(); # free the result set and the mysqli connection object $result->close(); $link->close(); ?> </body> </html>
Suponemos que el proceso ejecutándose en el servidor web puede alcanzar la IP del nodo SQL.
De forma parecida, puede usar la MySQL C API, Perl-DBI, Python-mysql, o los conectores propios de MySQL AB para realizar las tareas de definición y manipulación de datos como haría normalmente con MySQL.
Recuerde que cada tabla NDB
debe tener una clave primaria. Si no se define
clave primaria por el usuario cuando se crea la tabla, el
motor NDB Cluster
creará una oculta
automáticamente. (Nota:
esta clave oculta ocupa espacio como cualquier otro índice
de tabla. No es raro encontrar problemas debido a espacio
insuficiente en memoria para guardar estos índices creados
automáticamente.)
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.