====== Optimisation de base de données ======
TODO
index, requetes
======Java & Base de données======
[[java:base_de_donnees|Java & Base de données]]
====Utilisation d'une DataSource====
[[serveurweb:gestion_de_data_source]]
====== Mysql ======
===Test de connection===
$mysqladmin -h 'hosname' version[variables]
===== Connexion ====
==== Connexion en local ====
mysql -h hote -u utilisateur -p
show tables;
show databases;
USE test;
describe tables;
CREATE DATABASE montest;
load data local Infile "....sql" Into Table foo
source nomFichier
==== Connexion via un tunnel SSH sur Internet ====
Pour ce connecter sur un serveur ou l'acces a MySQL est uniquement en local ou protege par un firewall, l'on peut utiliser un relais SSH
$ ssh -f -N -L port_local_mapping:MySQL_server_URL:port_mysql user@ssh_server
# par exemple
$ ssh -f -N -L 3306:127.0.0.1:3306 test@gwadanina.ssh
===== Deplacer les fichiers de votre serveur MySQL =====
Si l'on veux mettre les fichier de la base de donnees dans un autre repertoire:
$ /etc/init.d/mysql stop
$ mv /var/lib/mysql /home/var/
$ ln -s /home/var/mysql/ /var/lib/mysql
$ chown mysql:mysql /home/var/mysql
$ /etc/init.d/mysql start
===== Backup de votre serveur MySQL =====
=== Sauvegarde via mysqldump ===
# Pour exporter toutes les base de donnees vers un dossier
$ mysqldump --all-databases -uroot -p --tab=/tmp
# Pour exporter toutes les base de donnees avec gain de place
$ mysqldump --all-databases -uroot -p | gzip > $(date +%F-%T)_all-databases.sql.gz
# Pour exporter une seule table, d'une seule base de donnees
$ mysqldump -uroot -p gwadanina_database --tables gwadanina_table | gzip > $(date +%F-%T)_gwadanina_database.sql.gz
# Pour exporter une seule base de donnees, si vous souhaitez créer un fichier de sauvegarde qui
# peut reecrire une base existante sans avoir à supprimer l'ancienne base de données manuellement en premier.
$ mysqldump --add-drop-table -uroot -p gwadanina_test| gzip > $(date +%F-%T)_gwadanina_test.sql.gz
# Pour exporter toutes les base de donnees avec gain de place et drop des tables existantes
$ mysqldump --all-databases --add-drop-table -u root -p | gzip > $(date +%F-%T)_all-databases.sql.gz
# Sauvegarde seulement les donnees sans la structure de base de données
$ mysqldump -uroot -p --no-create-info --databases gwadanina_test | gzip > $(date +%F-%T)_structurebackup.sql.gz
# Sauvegarde seulement la structure de base de données sans les donnees
$ mysqldump -uroot -p --no-data --databases gwadanina_test | gzip > $(date +%F-%T)_structurebackup.sql.gz
=== Restauration d'un fichier .sql ===
$ mysql -u root -p gwadanina_test < 2010-01-25-23:07:57_gwadanina_test.sql
# restoration depuis l'archive
$ gunzip < 2010-01-25-23:07:57_gwadanina_test.sql | mysql -u root -p gwadanina_test
# restoration de plusieurs fichiers sql
$ cat gwadanina_test1.sql gwadanina_test2.sql | mysql -u root -p gwadanina_test
# Pour que le serveur relise les droits.
$ mysqladmin flush-privileges
=== Déplacement des données directement entre les bases de données ===
# Déplacement des données directement entre les bases de données
$ mysqldump --all-databases --add-drop-table -u root -p | mysql -u root -p --host=XXX.XXX.XXX
# Déplacement des données directement entre les bases de données via SSH
$ mysqldump --all-databases --add-drop-table -u root -p | ssh user:password@gwadanina.net "mysql -u root -p"
==== Script de sauvegarde de mysql avec cron====
=== Preparation de l'environnement sur Debian ===
# Creer un compte utilisateur en local
$ useradd --home /home/backupspace --shell /bin/bash backupspace
# Preparation du repertoire de backup en local
$ mkdir -p /home/backupspace/archives/mysqlBackup
$ chown backupspace:backupspace -R /home/backupspace
$ chmod 770 /home/backupspace/archives
# Creer un compte mySQL avec uniquement des droits de lecture sur toute la base de donnees
$ mysql -u root -p -h localhost
mysql> CREATE USER 'mySQLBackupAccount'@'localhost' IDENTIFIED BY 'mySQLBackupPassword';
mysql> GRANT SELECT, INSERT, LOCK TABLES ON *.* TO 'mySQLBackupAccount'@'localhost';
mysql> FLUSH PRIVILEGES;
mysql> EXIT;
# creation du repertoire de script
$ su backupspace
$ mkdir -p /home/backupspace/script
# creation du script
$ touch /home/backupspace/script/mySQLBackup.sh
$ chmod u+x /home/backupspace/script/mySQLBackup.sh
=== Code du script de backup et d'optimisation de la base de donnees ===
$ nano /home/backupspace/script/mySQLBackup.sh
#!/bin/bash
# BACKUP all MySQL databases
#
# List the databases and a user backup
# Indépendamment in a file. Sql then compresses
# Files in a tar.gz
# http://gwadanina.net
#---------------------- System Parameters --------------------#
# Variables definition
MYSQL="$(which mysql)"
MYSQLDUMP="$(which mysqldump)"
GZIP="$(which gzip)"
MKDIR="$(which mkdir)"
# Date of day
DATE_NOW="$(date +"%Y-%m-%d")"
# Location of backup file locally
BACKUP_REPO="/home/backupspace/archives/mysqlBackup"
KEEP_LOCAL_FILE=y
# Number of days to retain a backup in local
DAY_TO_KEEP_BACKUP_LOCAL=90
#---------------------- MySQL Parameters --------------------#
#Configuring the connection to the mySQL database
SQL_USER="mySQLBackupAccount"
SQL_USER_PASSWORD="mySQLBackupPassword"
SQL_SERVER_HOST="localhost"
# Not to save this Databases list (separated by spaces)
NOT_TO_SAVE=""
#---------------------- Mail Parameters --------------------#
IS_MAIL_TO_SEND=y
# email addresses to send log extract, separated by a space
EMAILS_ADRESSES="backupspace"
EMAILS_SUBJECT="[MySQL_BACKUP]"$DATE_NOW
# --------------------------------------------------------- #
# End of Parameters #
# --------------------------------------------------------- #
# Creation of working directory
DEST_WORKING="$BACKUP_REPO/$DATE_NOW/"
[ ! -d $DEST_WORKING ] && $MKDIR -p $DEST_WORKING || :
# Creation of temporary log in working folder
TMP_LOG=$DEST_WORKING"sql_backup_$DATE_NOW.log";
echo "["$(date +%F-%T)"] - Today working directory is : " $DEST_WORKING > $TMP_LOG;
# Backuping the database
echo "["$(date +%F-%T)"] - Creating the list of all your databases..." >> $TMP_LOG;
DATABASE_TABLE_LISTE="$($MYSQL -u$SQL_USER -h$SQL_SERVER_HOST -p$SQL_USER_PASSWORD -Bse 'show databases')"
# If an error occurs in the list of databases
if [ ! $? -eq 0 ] ; then
echo "["$(date +%F-%T)"] - An error occurred while listing databases " >> $TMP_LOG;
fi
echo "["$(date +%F-%T)"] - List of all your databases..." $DATABASE_TABLE_LISTE >> $TMP_LOG;
for BASE in $DATABASE_TABLE_LISTE
do
# analyse, checking tables.
mysqlcheck -u$SQL_USER -h$SQL_SERVER_HOST -p$SQL_USER_PASSWORD -c -a -o $BASE >> $TMP_LOG;
if [ ! $? -eq 0 ] ; then
echo "["$(date +%F-%T)"] - An error occurred analyse, checking " $BASE "tables." >> $TMP_LOG;
fi
skipdb=-1
if [ "$NOT_TO_SAVE" != "" ] ; then
for i in $NOT_TO_SAVE
do
[ "$BASE" == "$i" ] && skipdb=1 || :
echo "["$(date +%F-%T)"] - Skipping " $BASE >> $TMP_LOG;
done
fi
# Creation of dump tables
if [ "$skipdb" == "-1" ] ; then
echo "["$(date +%F-%T)"] - Backing up " $BASE " databases... " >> $TMP_LOG;
SQL_FILE_NAME=$DEST_WORKING$BASE.$DATE_NOW.sql.gz
$MYSQLDUMP -u$SQL_USER -h$SQL_SERVER_HOST -p$SQL_USER_PASSWORD $BASE | $GZIP -f -9 > $SQL_FILE_NAME
if [ ! $? -eq 0 ] ; then
echo "["$(date +%F-%T)"] - An error occurred in backing up " $BASE "tables." >> $TMP_LOG;
fi
# size of the archive log and name
FILESIZE=`ls -lh $SQL_FILE_NAME | awk '{print $5}'`
echo "["$(date +%F-%T)"] - Generation of the archive for : "$SQL_FILE_NAME" ("$FILESIZE")" >> $TMP_LOG;
fi
done
#---------- remove local old files as fo date----------#
if [ "$KEEPLOCAL" = "y" ] ; then
cd $BACKUP_REPO
echo "["$(date +%F-%T)"] - Search and delete the archive with more than "$DAY_TO_KEEP_BACKUP_LOCAL" DAY" >> $TMP_LOG;
find $BACKUPDIR -maxdepth 1 -type f -ctime +$DAY_TO_KEEP_BACKUP_LOCAL -exec rm -v {} \; >> $TMP_LOG ;
if [ ! $? -eq 0 ] ; then
echo "["$(date +%F-%T)"] - An error occurred Search and delete the archive" >> $TMP_LOG;
fi
fi
#---------------------- Send Mail --------------------#
if [ "$IS_MAIL_TO_SEND" = "y" ] ; then
mail -s $EMAILS_SUBJECT $EMAILS_ADRESSES < $TMP_LOG;
echo "["$(date +%F-%T)"] - send mail is done" >> $TMP_LOG;
fi
echo "["$(date +%F-%T)"] - Your backup is complete!" >> $TMP_LOG;
echo "" >> $TMP_LOG;
# write log on output for script log
echo $TMP_LOG;
=== Finalisation de la configuration ===
# Mise en place du cron
$ crontab -e
Puis ajoutez ceci
#chaque jour a 3h46
46 03 * * * /home/backupspace/script/mySQLBackup.sh >> /var/log/mysql_backup.log
# creation du fichier de log
$ sudo touch /var/log/mysql_backup.log
$ sudo chown backupspace:backupspace /var/log/mysql_backup.log
$ sudo chmod 770 /var/log/mysql_backup.log
TODO : configuration de syslog ou Logrotate a voir
===== Optimiser votre serveur MySQL =====
=== Limiter les requêtes avec un timeout pour que MySQL ne s'emballe pas ===
rajouter dans le fichier ///etc/mysql/my.cnf//
[mysqld]
connect_timeout = 60
===== Visualiser les tables votre serveur MySQL =====
MySQL Workbench permet à un développeur DBA, ou l'architecte de concevoir visuellement des données, le modèle, générer et gérer des bases de données. Il comprend tout ce dont un modélisateur de données a besoin pour créer des modèles complexes ER, avant et rétro-ingénierie, et offre également des fonctions clés pour effectuer la gestion du changement difficile et les tâches de documentation qui exigent normalement beaucoup de temps et d'efforts :
[[http://mysql.com/products/workbench/|MySQL workbench]]
==== Tuning Primer for Mysql ====
# vérifier si le PATH est bon PATH=$PATH:/usr/local/mysql/bin/
$ cd /tmp
$ wget http://day32.com/MySQL/tuning-primer.sh
$ chmod +x tuning-primer.sh
$ ./tuning-primer.sh
Puis appliquer les recommandations.
nano /etc/mysql/my.cnf
# réduire le nombre de connexions maximum
max_connections = 50
# autoriser MySQL à utiliser toute la mémoire cache
query_cache_limit = 16M
# activer la surveillance des requêtes les plus lentes et supérieur à 5 secondes
log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 5
site officiel : [[http://www.day32.com/MySQL/|www.day32.com]]
====== PostgreSql ======
===Connexion===
$su postgres
==Création d'un utilisateur==
createuser dbuser
==Création d'une base de données==
createdb dbtest
==Se connecter==
psql dbtest
== Modifier les caractéristiques d'un utilisateur ==
//Changer un mot de passe d'un utilisateur//
ALTER USER dbuser ENCRYPTED PASSWORD 'password';
**GRANT** :
//Ajouter tous les priviléges à l'utilisateur dbuser sur la table table1//
GRANT ALL PRIVILEGES ON table1 TO dbuser;
===Mode graphique===
http://127.0.0.1/phppgadmin avec l’utilisateur dbuser devrait fonctionner
==== Liens PostgreSql ====
* [[http://www.postgresql.org/docs/aw_pgsql_book/|PostgreSQL: Introduction and Concepts]]
* [[http://www.linux-france.org/article/serveur/psql/guide-utilisateur/book1.html|Guide de l'utilisateur]]
* [[http://traduc.postgresqlfr.org/|Site de traduction]]
* [[http://traduc.postgresqlfr.org/pgsql-fr/|Documentation PostgreSQL 7.4]]
* [[http://techdocs.postgresql.org/|PostgreSQL Technical Documentation]]
* [[http://advocacy.postgresql.org/?lang=fr|advocacy.postgresql.org]]
* [[http://www.postgresql.org/docs/7.4/static/jdbc.html|Doc JDBC Postgresql 7.4]]
====== Oracle ======
Merge d'une table sur elle meme avec Oracle:
MERGE INTO table_test tt
USING (SELECT * FROM DUAL) d
ON (tt.teck = 'toto')
WHEN MATCHED THEN
UPDATE
SET ...
WHEN NOT MATCHED THEN
INSERT (...)
VALUES (...);