MySQL - Configuració i gestió

Introducció gestió MySQL des de línea de comandes

En aquest exemple podem veure com llistar les B.D. de MySQL i com llistar les taules d'una B.D. en concret. Utilitzem el client **mysql** i si l'usuari root encara no té password assignada (molt insegur, cal assignar-li una seguint l'explicació de més avall) l'opció -p no és necessària o cal introduir-la buida.

$ mysql -u root -p
Enter password:
mysql> show databases;
+--------------+
| Database     |
+--------------+
| basedades1   |
| basedades2   |
| mysql        |
+--------------+
8 rows in set (0.00 sec)

mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed

mysql> show tables;
+-----------------+
| Tables_in_mysql |
+-----------------+
| columns_priv    |
| db              |
| func            |
| host            |
| tables_priv     |
| user            |
+-----------------+
6 rows in set (0.00 sec)
mysql > quit

Introduir el primer password d'usuari root

Primer cal saber el nom de la nostra màquina. Ho fem amb la comanda:

$ hostname

Ara assignarem el password d'usuari root dues vegades: per la màquina //localhost// i per la màquina //nomservidor// (el que hem obtingut amb la comanda anterior). En realitat totes dues són la mateixa màquina: una rep les peticions internes i l'altre les de l'exterior.

$ mysqladmin -u root -h localhost password 'novapassword' -p
$ mysqladmin -u root -h nomservidor password 'novapassword' -p

Canviar el password d'usuari root

$ mysql -u root -p
Enter password:
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed

mysql> select Host, User, Password  from user;
+-----------+------------------+------------------+
| Host      | User             | Password         |
+-----------+------------------+------------------+
| localhost | root             | 4b29db693ef59bdc |
| zikmy     | root             | 4b29db693ef59bdc |
| localhost |                  |                  |
| zikmy     |                  |                  |
| localhost | debian-sys-maint | 7eda1aa86ce9af77 |
+-----------+------------------+------------------+
5 rows in set (0.00 sec)

mysql > update user set Password=PASSWORD('nova_password') where user='root';
mysql > quit

Reiniciem el servidor per habilitar el nou password:

$ /etc/init.d/mysqld restart

Crear i eliminar una base de dades

//crear
$ mysqladmin -u root -p create nom_base_dades
//eliminar
$ mysqladmin -u root -p drop nom_base_dades

Crear usuaris

CREATE USER 'usuari'@'localhost' IDENTIFIED BY 'motdepas';

Crear usuaris que només puguin administrar la seva base de dades

$ mysql -u root -p
mysql> GRANT select, insert, update, create, alter, delete, drop ON nom_base_dades.* TO usuari@localhost IDENTIFIED BY 'password';
mysql> GRANT ALL PRIVILEGES ON nom_base_dades.* TO usuari@localhost IDENTIFIED BY 'password';

Eliminar usuaris

En MySQL 5.0.2:

$ mysql -u root -p
mysql> DROP USER nom_usuari

El més probable es que estigueu administrant MySQL 4.1.1 a la 5.0.1. Llavors cal algunes línies més de codi:

$ mysql -u root -p
mysql> DELETE FROM mysql.user WHERE User='user_name' and Host='host_name';
mysql> FLUSH PRIVILEGES;

Volcar dades desde fitxers de text que contenen comandes SQL

Fer un backup de totes les bases de taules d'una base de dades de mysql a un fitxer de text anomenat FITXER.sql:

$ mysqldump --opt --password=CLAU --user=USUARI NomBaseDades > FITXER.sql

Per fer una còpia de seguretat d'una taula d'una base de dades, s'ha d'afegir el nom de la taula a la sentència anterior:

$ mysqldump --opt --password=CLAU --user=USUARI NomBaseDades NomTaula > FITXER.sql

Volcar dades d'un fitxer FITXER.sql que conté comandes SQL:

$ mysql -u root -p nombasedades < FITXER.sql

Obrir servidor MySQL cap l'exterior

Fitxer /etc/mysql/my.cnf ha de tenir skip-networking comentat i bind-address a 0.0.0.0:

#bind-address           = 127.0.0.1 # Només permet connexions locals
bind-address            = 0.0.0.0 # Permet connexions des de qualsevol IP

#skip-networking

Desprès cal reiniciar servidor mysql:

/etc/init.d/mysql restart

Fixem-nos que els fitxers /etc/hosts.deny i /etc/hosts.allow no continguin restriccions.

Podem comprovar que el port 3306 de mysql està obert fent:

nmap <ip_servidor>

Desprès hem de donar permisos d'accés a la base de dades per un usuari que accedeixi des del localhost, una IP determinada o des de qualsevol lloc:

mysql -u root -p

GRANT select, insert, update, create, alter, delete, drop ON base_de_dades.* TO nom_usuari@localhost IDENTIFIED BY 'password';

GRANT select, insert, update, create, alter, delete, drop ON base_de_dades.* TO nom_usuari@IP_determinada IDENTIFIED BY 'password';

GRANT select, insert, update, create, alter, delete, drop ON base_de_dades.* TO nom_usuari IDENTIFIED BY 'password';

Cerca i reemplaça

Exemple de cerca reemplaça:

update zik_content set fulltext2 = replace(fulltext2, '{/tabs}', '{/tab}');

mysqlcheck

mysqlcheck --user=root --password --databases nombasedades

marked as crashed

$ ERROR 144 (HY000) at line 1: Table './aula/mdl_role_assignments' is marked as crashed and last (automatic?) repair failed

Parem el mysql per fer aquestes operacions:

cd /var/lib/mysql/aula
myisamchk -r <table_name>

Si no:

myisamchk -r -v -f <table_name>.

Mysql Macos X - 10.5

Arrancar i parar servidor Mysql

sudo /Library/StartupItems/MySQLCOM/MySQLCOM start
sudo /Library/StartupItems/MySQLCOM/MySQLCOM stop

Directori comandes

/usr/local/mysql/bin

Date 2038

El camp timestamp té una limitació i no mostra les dates més grans de l'any 2038. Hem d'utilitzar el camp datetine

A continuació un exemple de canvi del camp timestamp a datetine:

# rename the old TIMESTAMP field
ALTER TABLE `zik_training_session` CHANGE `date_end` `temp_date_end` int(11) NOT NULL;

# create a new DATETIME column of the same name as your old column
ALTER TABLE `zik_training_session` ADD `date_end` DATETIME NOT NULL;

# update all rows by populating your new DATETIME field
UPDATE `zik_training_session` SET `date_end` = FROM_UNIXTIME(temp_date_end);

# remove the temporary column
ALTER TABLE `zik_training_session` DROP `temp_date_end`;

Year 2038 Bug: What is it? How to solve it?

System/Mysql (last edited 2013-05-14 07:29:35 by resteve)

Contenidos creados por el equipo de Zikzakmedia. Creative Commons By-NC-SA

PythonZikzakmedia