{{tag>Brouillon DB Mysql}}
= Notes MySQL / MariaDB
Liens :
* http://www.linuxjournal.com/content/mysql%E2%80%94some-handy-know-how
Réplication :
* http://blog.adminrezo.fr/2016/01/replication-mysql-masterslave/
Voir le client **mycli** en ligne de commande avec autocomplétion et coloration syntaxique
http://blog.adminrezo.fr/2016/01/mycli-pgcli-mysql-postregsql-clients/
Voir aussi **TokuDB** :
* https://en.wikipedia.org/wiki/TokuDB
* /etc/mysql/conf.d/tokudb.cnf
* https://mariadb.com/kb/en/how-to-enable-tokudb-in-mariadb/
DSN : mysql:host=localhost;dbname=strata
== Administration
Connexion à une base
mysql -h localhost -P 3306 -u myuser -pP@ssw0rd -D mydb
# Par socket Unix
mysql -u root -S /opt/mysql/5.0.45/socket/mysql-5045.sock -p
# En TCP
mysql -u root -h 127.0.0.1 -p
mysql -u root -h $HOSTNAME -p
Droit sur un DB, table
-- CREATE DATABASE `plop-plop` ;
CREATE DATABASE mydb;
CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'P@ssw0rd';
GRANT ALL PRIVILEGES ON mydb.* TO "myuser"@"localhost" IDENTIFIED BY 'P@ssw0rd';
FLUSH PRIVILEGES;
Droit sur les fichiers (import / export CSV par exemple)
GRANT FILE ON *.* TO 'myuser'@'localhost';
FLUSH PRIVILEGES;
Lister les comptes utilisateurs
select user from mysql.user;
select host, user, password from mysql.user;
Sécurité : effacer les comptes root sans mot de passe
mysql -N <<< "DELETE FROM mysql.user WHERE user='root' AND password='' ;"
Lecture seul sur toutes les bases
GRANT SELECT ON *.* TO 'myuserro'@'localhost' IDENTIFIED BY 'P@ssw0rd';
FLUSH PRIVILEGES;
Connaître les requêtes en cours
SHOW PROCESSLIST;
''~/.my.cnf''
[mysqldump]
user=root
password=P@ssw0rd!
[mysql]
user=root
password=P@ssw0rd!
[mysqladmin]
user=root
password=P@ssw0rd!
[mysqlshow]
user=root
password=P@ssw0rd!
ou bien :
''~/.my.cnf''
[client]
user=root
password=P@ssw0rd!
C'est valable pour **mysql**, **mysqldump** etc..
chmod 600 ~/.my.cnf
''bck-mysql.sh''
#! /bin/bash
set -o nounset
DATE=$(date +%Y%m%d%H%M)
BCK_DIR=~/backup
DB_LIST=$(mysql --batch -N <<< """show databases;""" |egrep -v "^(information_schema|performance_schema|mysql)$")
RET=$?
mysqldump --single-transaction --skip-lock-tables information_schema > ${BCK_DIR}/information_schema-${DATE}.sql.gz
RET=$((RET + $?))
mysqldump --single-transaction --skip-lock-tables performance_schema > ${BCK_DIR}/performance_schema-${DATE}.sql.gz
RET=$((RET + $?))
mysqldump --single-transaction --ignore-table=mysql.event mysql > ${BCK_DIR}/mysql-${DATE}.sql.gz
RET=$((RET + $?))
for DB in $DB_LIST
do
mysqldump --single-transaction $DB |pigz > ${BCK_DIR}/${DB}-${DATE}.sql.gz
RET=$((RET + $?))
done
if [ $(find $BCK_DIR -type f -iname "*.sql.gz" -size -10k |wc -l) -gt 0 ]
then
echo "Error empty file" >&2
RET=$((RET + 1))
fi
exit $RET
=== Création ou recréation du dossier /var/lib/mysql
Par exemple après un export
mysqlcheck --all-databases -u root -pP@ssw0rd |pigz > all-dbs.sql.gz
chown mysql: /var/lib/mysql
chmod 700 /var/lib/mysql
# mysqld --initialize
mysql_install_db
mysql_secure_installation
== Config my.cnf
Voir mysqltuner.pl
Sur RedHat par défaut le fichier my.cnf ne possède pas de configuration. Il faut partir d'un exemple
/etc/my.cnf{,.orig}
cp -p /usr/share/mariadb/my-medium.cnf /etc/my.cnf
''/etc/mysql/conf.d/lowmem.cnf''
[mysqld]
performance_schema = off
key_buffer_size = 16K
max_allowed_packet = 1M
thread_stack = 64K
table_cache = 4
sort_buffer_size = 64K
net_buffer_length = 2K
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
innodb_buffer_pool_size = 16M
innodb_log_file_size = 5M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50
[mysqldump]
quick
max_allowed_packet = 16M
[mysql]
no-auto-rehash
[isamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
[myisamchk]
key_buffer_size = 8M
sort_buffer_size = 8M
[mysqlhotcopy]
interactive-timeout
=== Pb
Error: Table './glpidb/glpi_logs' is marked as crashed and should be repaired
Solution
Vérif
df -hP
df -hPi
Puis. Mais ne marche malheureusement pas pour les tables en innodb.
#mysqlcheck --repair --all-databases
mysqlcheck --auto-repair --check -A
==== Erreur importation
mysql -h localhost -u myuser -D mydb -pmypass < /root/plop.sql
Warning: Using a password on the command line interface can be insecure.
ERROR 1071 (42000) at line 52: Specified key was too long; max key length is 767 bytes
SET @@global.innodb_large_prefix = 1;
mysql -D mydb < /root/plop.sql
ERROR 1709 (HY000) at line 53: Index column size too large. The maximum column size is 767 bytes.
CREATE TABLE `SimpleSAMLphp_saml_LogoutStore` (
`_authSource` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`_nameId` varchar(40) COLLATE utf8mb4_unicode_ci NOT NULL,
`_sessionIndex` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
`_expire` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`_sessionId` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
UNIQUE KEY `_authSource` (`_authSource`,`_nameId`,`_sessionIndex`),
KEY `SimpleSAMLphp_saml_LogoutStore_expire` (`_expire`),
KEY `SimpleSAMLphp_saml_LogoutStore_nameId` (`_authSource`,`_nameId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Ajout de ''ROW_FORMAT=Dynamic'' dans le ''CREATE TABLE''
CREATE TABLE `SimpleSAMLphp_saml_LogoutStore` (
`_authSource` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`_nameId` varchar(40) COLLATE utf8mb4_unicode_ci NOT NULL,
`_sessionIndex` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
`_expire` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`_sessionId` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
UNIQUE KEY `_authSource` (`_authSource`,`_nameId`,`_sessionIndex`),
KEY `SimpleSAMLphp_saml_LogoutStore_expire` (`_expire`),
KEY `SimpleSAMLphp_saml_LogoutStore_nameId` (`_authSource`,`_nameId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=Dynamic;
=== Autres
Turn on the expanded table formatting mode. This is equivalent to the \x command.
`psql` expanded mode equivalency for `mysql`
SELECT * FROM mytable \G;
=== Optimisation
Optimiser my.cnf
./mysqltuner.pl
Defrag All Tables or All Databases
mysqlcheck -A
== Problème
=== Pb Invalid (old?) table or database name 'lost+found'
[ERROR] Invalid (old?) table or database name 'lost+found'
==== Solution
''/etc/mysql/mariadb.conf.d/50-server.cnf''
[mysqld]
ignore-db-dirs = lost+found
=== Error in accept: Too many open files
''/var/log/mysql/error.log''
190215 11:29:50 [ERROR] /usr/sbin/mysqld: Can't open file: './aquaprox/wp_options.frm' (errno: 24)
190215 11:30:16 [ERROR] /usr/sbin/mysqld: Can't open file: './logiindu/backupdb_wplogi_lstat.frm' (errno: 24)
190215 11:30:17 [ERROR] /usr/sbin/mysqld: Can't open file: './logiindu/backupdb_wplogi_lstat.frm' (errno: 24)
190215 11:30:18 [ERROR] /usr/sbin/mysqld: Can't open file: './logiindu/backupdb_wplogi_lstat.frm' (errno: 24)
190215 11:30:30 [ERROR] /usr/sbin/mysqld: Can't open file: './logiindu/backupdb_wplogi_lstat.frm' (errno: 24)
190215 11:30:31 [ERROR] /usr/sbin/mysqld: Can't open file: './logiindu/backupdb_wplogi_lstat.frm' (errno: 24)
190215 11:30:32 [ERROR] /usr/sbin/mysqld: Can't open file: './logiindu/backupdb_wplogi_lstat.frm' (errno: 24)
190215 11:31:40 [ERROR] Error in accept: Too many open files
==== Solution
mysql> SHOW VARIABLES LIKE 'open%' ;
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| open_files_limit | 1024 |
+------------------+-------+
1 row in set (0.00 sec)
''/etc/security/limits.d/50-mysql.conf''
mysql hard nofile 11264
mysql soft nofile 11264
su - mysql -s /bin/bash
ulimit -Hn
ulimit -Sn
session required pam_limits.so
''/etc/mysql/my.cnf''
[mysqld]
open_files_limit = 10240