# mysql ### Connexion à la base: #### Se connecter à MySQL: ```bash $ mysql -u root -p Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 18 Server version: 10.3.11-MariaDB Homebrew Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]> ``` #### Connexion à la base wordpress4 par l’utilisateur root: ```bash $ mysql -u root -D wordpress4 -p 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 MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 17 Server version: 10.3.11-MariaDB Homebrew Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [wordpress4]> ``` #### Quitter MySQL: ```bash MariaDB [wordpress4]> exit Bye ``` ### Types de bases (moteur de stockage): [InnoDB](https://dev.mysql.com/doc/refman/5.5/en/innodb-storage-engine.html) Conseil: enable innodb_file_per_table = 1 option to put indexes and data for individual tables into distinct files. Requête pour trouver les tables InnoDB parmi toutes les bases: ```mysql mysql> SELECT table_schema, table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine = 'innodb'; ``` Constitution de Mysql (par défaut): ```bash bruno@silverbook:/usr/local/var/mysql$ -rw-r----- 1 bruno admin 15114 28 nov 08:08 ib_buffer_pool -rw-rw---- 1 bruno admin 50331648 3 déc 10:35 ib_logfile0 -rw-rw---- 1 bruno admin 50331648 24 oct 12:51 ib_logfile1 -rw-rw---- 1 bruno admin 79691776 3 déc 10:35 ibdata1 -rw-rw---- 1 bruno admin 12582912 28 nov 16:53 ibtmp1 -rw-rw---- 1 bruno admin 1272770 3 déc 10:35 silverbook.home.err -rw-rw---- 1 bruno admin 5 28 nov 16:53 silverbook.home.pid ``` - ibdata1: fichier de 10Mo extensible. InnoDB y stocke tout (bases,tables, index...) pour éviter la fragmentation. - ib_logfile0, ib_logfile1: 2 fichiers log de 5Mo. - ibtmp1 - ib_buffer_pool: - silverbook.home.err: fichier log des erreurs http://forum.wgpower.net/technique/innodb-fichier-ibdata1-trop-37009_1.html https://vdachev.net/2007/02/22/mysql-reducing-ibdata1/ https://stackoverflow.com/questions/3456159/how-to-shrink-purge-ibdata1-file-in-mysql [MyISAM](https://dev.mysql.com/doc/refman/5.5/en/myisam-storage-engine.html) #### Connaitre le type de bases par défaut: mysql> show engine; ```bash MariaDB [(none)]> show engines; +--------------------+---------+----------------------------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------------------------+--------------+------+------------+ | MRG_MyISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | CSV | YES | Stores tables as CSV files | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | MyISAM | YES | Non-transactional engine with good performance and small data footprint | NO | NO | NO | | Aria | YES | Crash-safe tables with MyISAM heritage | NO | NO | NO | | InnoDB | DEFAULT | Supports transactions, row-level locking, foreign keys and encryption for tables | YES | YES | YES | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | | SEQUENCE | YES | Generated tables filled with sequential values | YES | NO | YES | +--------------------+---------+----------------------------------------------------------------------------------+--------------+------+------------+ 8 rows in set (0.007 sec) ``` #### ENGINE utilisé pour une table: mysql> SELECT TABLE_NAME, ENGINE FROM information_schema.TABLES where TABLE_SCHEMA = 'database'; ```bash MariaDB [(none)]> SELECT TABLE_NAME, ENGINE FROM information_schema.TABLES where TABLE_SCHEMA = 'zenphoto'; +------------------+--------+ | TABLE_NAME | ENGINE | +------------------+--------+ | _menu | InnoDB | | .tags | InnoDB | | .plugin_storage | InnoDB | | _images | InnoDB | | .pages | MyISAM | | .menu | InnoDB | | _plugin_storage | InnoDB | | .admin_to_object | InnoDB | | _tags | InnoDB | .../... | .captcha | InnoDB | | .news | InnoDB | | .comments | MyISAM | | _admin_to_object | InnoDB | | _comments | InnoDB | | _pages | InnoDB | +------------------+--------+ 32 rows in set (0.012 sec) ``` ### Bases: #### Voir toutes les bases: mysql> SHOW DATABASES; ```bash MariaDB [(none)]> SHOW DATABASES; +--------------------+ | Database | +--------------------+ | funnymac | | ghost_prod | | information_schema | | mgpt | | mysql | | performance_schema | | phpmyadmin | | piwik | | python | | ssi | | wordpress4 | | wordpress5 | | xhprof | | xhprof_gui | | yeswiki | | zenphoto | +--------------------+ 16 rows in set (0.007 sec) ``` #### Utiliser une base existante: mysql> USE database; ```bash MariaDB [(none)]> USE ssi 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 MariaDB [ssi]> ``` #### Supprimer une base: mysql> DROP DATABASE database ```bash MariaDB [(none)]> DROP DATABASE zenphoto ``` ### Tables: #### Voir les tables de la base courante: mysql [database]> SHOW TABLES; ```bash MariaDB [zenphoto]> SHOW TABLES; +--------------------+ | Tables_in_zenphoto | +--------------------+ | .admin_to_object | | .administrators | | .albums | | .captcha | | .comments | | .images | .../... | _news | | _news2cat | | _news_categories | | _obj_to_tag | | _options | | _pages | | _plugin_storage | | _search_cache | | _tags | +--------------------+ 32 rows in set (0.000 sec) ``` #### Structure d’une table: mysql [database]> DESCRIBE table; ```bash MariaDB [zenphoto]> DESCRIBE _tags; +-------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------+------+-----+---------+----------------+ | id | int(11) unsigned | NO | PRI | NULL | auto_increment | | name | varchar(255) | NO | UNI | NULL | | +-------+------------------+------+-----+---------+----------------+ 2 rows in set (0.030 sec) ``` #### Renommer une table: mysql [database]> ALTER TABLE table AS new_table; ```bash MariaDB [zenphoto]> ALTER TABLE _tags RENAME AS _new-tags; ``` #### Vérification des tables : 2 solutions: **1) CHECK TABLE table;** ```bash MariaDB [zenphoto]> CHECK TABLE _tags; +----------------+-------+----------+----------+ | Table | Op | Msg_type | Msg_text | +----------------+-------+----------+----------+ | zenphoto._tags | check | status | OK | +----------------+-------+----------+----------+ 1 row in set (0.043 sec) ``` **2) [mysqlcheck](https://mariadb.com/kb/en/library/mysqlcheck/)** mysqlcheck verrouille chaque table en lecture seule (la base est alors inaccessible pour les autres processus pendant ce temps) pour vérification ou réparation. ```bash $ mysqlcheck -u root -ppassword zenphoto zenphoto..admin_to_object OK zenphoto..administrators OK zenphoto..albums OK zenphoto..captcha OK zenphoto..comments OK zenphoto..images OK zenphoto..menu OK .../... zenphoto._news2cat OK zenphoto._news_categories OK zenphoto._obj_to_tag OK zenphoto._options OK zenphoto._pages OK zenphoto._plugin_storage OK zenphoto._search_cache OK zenphoto._tags OK ``` #### Optimiser: Les bases InnoDB ne supportent pas l’option OPTIMIZE. A la place,MySQL crée une nouvelle table, y copie toutes les lignes, efface l’ancienne table, renomme la nouvelle et lance ANALYSE ```bash mysqlcheck -u root -ppassword -o --all-databases funnymac.download OK funnymac.downloads OK funnymac.eggs OK funnymac.ipod OK funnymac.ipod_news OK funnymac.ipod_vers OK funnymac.liens OK funnymac.livre OK funnymac.note OK funnymac.numeric_info Table is already up to date funnymac.numeric_log OK funnymac.numeric_vers OK funnymac.tips OK funnymac.truc OK funnymac.vote OK ghost_prod.accesstokens note : Table does not support optimize, doing recreate + analyze instead status : OK ``` #### Réparer des tables : [MySQL Server logs](https://dev.mysql.com/doc/refman/5.7/en/server-logs.html) La 1ere chose à faire en cas de problèmes est de consulter les fichiers logs. Ceux-çi sont généralement avec les tables: ```bash #osx (Homebrew): $ cd /usr/local/var/mysql total 388560 drwxr-xr-x 32 bruno admin 1024 28 nov 16:53 . drwxrwxr-x 13 bruno admin 416 16 fév 2018 .. -rw-rw---- 1 bruno admin 16384 28 nov 08:08 aria_log.00000001 -rw-rw---- 1 bruno admin 52 28 nov 08:08 aria_log_control drwx------ 48 bruno admin 1536 1 déc 17:05 funnymac drwx------ 53 bruno admin 1696 1 déc 17:05 ghost_prod -rw-r----- 1 bruno admin 15114 28 nov 08:08 ib_buffer_pool -rw-rw---- 1 bruno admin 50331648 3 déc 07:19 ib_logfile0 -rw-rw---- 1 bruno admin 50331648 24 oct 12:51 ib_logfile1 -rw-rw---- 1 bruno admin 79691776 3 déc 07:19 ibdata1 -rw-rw---- 1 bruno admin 12582912 28 nov 16:53 ibtmp1 drwx------ 9 bruno admin 288 1 déc 17:05 mgpt -rw-rw---- 1 bruno admin 0 24 jul 2017 multi-master.info drwx------ 89 bruno admin 2848 1 déc 17:05 mysql drwx------ 3 bruno admin 96 24 jul 2017 performance_schema drwx------ 41 bruno admin 1312 1 déc 17:05 phpmyadmi -rw-rw---- 1 bruno admin 1271878 3 déc 07:19 silverbook.home.err -rw-rw---- 1 bruno admin 5 28 nov 16:53 silverbook.home.pid ``` Pour réparer, 2 solutions: **1) REPAIR TABLE:** - ne nécessite pas l’arrêt de MySQL - uniquement base MyISAM ```bash MariaDB [zenphoto]> REPAIR TABLE _tags; +----------------+--------+----------+---------------------------------------------------------+ | Table | Op | Msg_type | Msg_text | +----------------+--------+----------+---------------------------------------------------------+ | zenphoto._tags | repair | note | The storage engine for the table doesn't support repair | +----------------+--------+----------+---------------------------------------------------------+ 1 row in set (0.006 sec) ``` Si l’erreur persiste, **vider le cache** (Flush all cache) **2) mysqlcheck -r:** - nécessite un arrêt du service MySQL - uniquement base MyISAM [MyISAM](https://dev.mysql.com/doc/refman/5.5/en/myisam-storage-engine.html): ```bash $ mysqlcheck -u root -ppassword -r zenphoto .comments zenphoto..comments OK ``` [InnoDB](https://dev.mysql.com/doc/refman/5.5/en/innodb-storage-engine.html): ```bash $ mysqlcheck -u root -ppassword -r zenphoto _tags zenphoto._tags note : The storage engine for the table doesn't support repair ``` Pour les tables InnoDB, il faut [forcer la récupération](https://dev.mysql.com/doc/refman/5.5/en/forcing-innodb-recovery.html): 1) Arrêter **mysqld**: 2) Sauvegarder **mysql**: ```bash #Linux /var/lib/mysql/ #osx (Homebrew) /usr/local/var/mysql/ ``` 3) Ajouter au fichier de configuration MySQL my.cnf: ``` #osx (Homebrew): /usr/local/etc/my.cnf [mysqld] innodb_force_recovery = 4 ``` 4) Redémarrer **mysqld**: 5a) Faire un dump des tables de la base avec **SELECT ... INTO OUTFILE**: ```mysql MariaDB [zenphoto]> SELECT * FROM _tags INTO OUTFILE '/tmp/corrupted.txt'; Query OK, 170 rows affected (0.011 sec) # Pour exporter au format csv: MariaDB [zenphoto]> SELECT * FROM _tags INTO OUTFILE '/tmp/corrupted.csv' FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\r\n'; Query OK, 170 rows affected (0.006 sec) ``` 5b) Faire. un dump de toutes les tables: ```bash $ mysqldump -A -u root -ppassword > '/tmp/dump.sql'; ``` 6) Parfois cela peut suffire. Sinon, 7) Supprimer les tables / bases corrompues (DROP ...) 8) Arrêter **mysqld**: 9) Supprimer les ib*: ```bash #Linux /var/lib/mysql/ib* #osx (Homebrew) /usr/local/var/mysql/ib* ``` 10) Quitter le mode force recovery: ``` [mysqld] #innodb_force_recovery = 0 ``` 11) Redémarrer **mysqld**: 12) Restaurer les bases: ```bash $ mysql -u root -ppassword < dump.sql ``` https://www.nixpal.com/mysql-innodb-corruption-repair-guide/ #### Vérifier et réparer: Vérifier toutes les bases et réparer les tables corrompues: ```bash $ mysqlcheck -u root -p -A --auto-repair Enter password: funnymac.download OK funnymac.downloads OK …/… ``` #### Erreur de syntaxe: Les commandes doivent se terminer par un **;** ```bash MariaDB [(none)]> mysqlcheck zenphoto -> -> \c MariaDB [(none)]> ``` Sinon taper **\c** pour revenir. #### Tache CRON pour maintenance MySQL ```bash echo "0 4 * * Sun root mysqlcheck -u maintenance --optimize --all-databases" > /etc/cron.d/mysqlcheck ``` ```bash $ mysql_upgrade -u root -ppassword Phase 1/7: Checking and upgrading mysql database Processing databases mysql mysql.column_stats OK mysql.columns_priv OK mysql.db OK mysql.event OK ``` #### BASH : exécuter une requête MySql et exploiter le résultat ```bash $ echo "SHOW DATABASES;" | mysql -h localhost -u root -ppassword Database information_schema mysql performance_schema wordpress zenphoto ``` [exécuter une requête MySql et exploiter le résultat](https://www.quennec.fr/trucs-astuces/systèmes/gnulinux/utilisation/bash-exécuter-une-requête-mysql-et-exploiter-le-résultat) #### Créer un utilisateur avec les permissions lecture seule pour le backup des bases. ```mysql GRANT SELECT, LOCK TABLES ON *.* TO 'MYBACKUPUSER'@'%' IDENTIFIED BY 'MYPASSWORD'; ```