Import a export databáze

Z Freenetis Wiki
Přejít na: navigace, hledání

Při vývoji je často potřeba pracovat s daty ostré databáze. Prázdná databáze po instalaci pro mnoho testování nestačí.

Import dat do databáze

Import SQL souboru s obsahem databáze je možné přes uživatelské rozhraní Phpmyadmina. Velké soubory pak ale často narazí na časový a datový limit PHP. Tyto limity je možné do jisté míry měnit v souboru

/etc/php5/apache2/php.ini

U velkých souborů toto nemusí stačit. Proto je snadné použití příkazové řádky. Stačí mít na počítači nekomprimovaný soubor SQL s daty k importu. Je potřeba mít na cílovém MySQL serveru prázdnou databázi. Pro import pak stačí v konzoli napsat

mysql -u username -p freenetis < freenetis.sql

Po importu databáze je nutné v Phpmyadminovi upravit některé položky v tabulce config. Jde o položky

  • protocol (na svém PC pro vývoj používáte typicky http místo https)
  • domain (na svém PC pro vývoj máte doménu localhost místo třeba freenetis.sdruzeni.net)
  • suffix (přípona za doménou, na serveru je to obvykle pouze /, pro localhost to je obvykle /freenetis/, záleží na vašem nastavení virtualhostu v Apachi)

Jestliže nenaběhne FreenetIS na vaší lokální stránce (typicky localhost/freenetis) kvůli selhání upgradu databáze, pak navštivte v phpmyadminu tabulku config a upravte položku db_schema_version na číslo verze, které najdete v souboru application/upgrade_sql/upgrade_sql.php. Jestliže přihlašovací stránka naběhne, ale přihlášení selže na neznámé chybě, pak ověřte, jestli se celý import dat provedl správně. V případě větší databáze se import nemusí provést správně a některé tabulky se nestihnou vytvořit, například tabulka users klíčová pro přihlášení. V tomto případě používejte import výhradně přes příkazovou řádku a nikoli přes webové rozhraní phpmyadmina.

Tip

Po importu pusťte v phpmyadminovi následující SQL dotaz

update users, (select password as newpass from users where login='vaslogin') u set password = u.newpass

Můžete tak snadněji testovat práva, protože takto všem uživatelům nastavíte vaše heslo podle vašeho loginu.

Tip

Výsledný SQL dotaz po importu databáze s produkčními daty na lokální vývojářský počítač:

update config set value = 'http' where name = 'protocol';
update config set value = 'localhost' where name = 'domain';
update config set value = '/freenetis/' where name = 'suffix';
update users, (select password as newpass from users where login='vaslogin') u set password = u.newpass

Export dat z databáze

V příkazové řádce se pak export databáze do souboru provede obdobně:

mysqldump -u username -p freenetis --routines > freenetis.sql

Skript All in one

Následující skript provádí víceméně vše předchozí automaticky za vás. Stačí jenom správně nastavit proměnné, zajít si na kávu a po návratu je váš lokální počítač připraven.

#!/bin/bash

############################################################################################
#                                                                                          #
#   Autor: Michal Kliment                                                                  #
#   Popis: Tento skript umoznuje vyvojarum FreenetISu snadnejsi import databaze z jejich   # 
#          ostre instalace FreenetISu na jejich lokalni pocitac.                           #
#                                                                                          #
#   Datum: 26. 7. 2011                                                                     #
#                                                                                          #
############################################################################################

############################################################################################
#      N A S T A V E N I   L O K A L N I   I N S T A L A C E   F R E E N E T I S U         #
############################################################################################

# Nazev lokalni databaze
LOCAL_DB_NAME="freenetis"
# Uzivatel lokalni databaze
LOCAL_DB_USER="freenetis"
# Heslo k lokalni databazi
LOCAL_DB_PASSWORD="freenetis"

# Protokol lokalniho freenetisu, http nebo htts
PROTOCOL="http"
# Domena lokalniho freenetis, pravdepodobne localhost
DOMAIN="localhost"
# Pripona adresy lokalniho freenetisu, pravdepodobne /freenetis/
SUFFIX="/freenetis/"
# Uzivatel freenetisu, jehoz heslo se nastavi vsem uzivatelum v systemu
USER_LOGIN="admin"

############################################################################################
#      N A S T A V E N I   "O S T R E"  I N S T A L A C E   F R E E N E T I S U            #
############################################################################################

# Nazev "ostre" databaze
REMOTE_DB_NAME="freenetis"
# Uzivatel "ostre" databaze
REMOTE_DB_USER="freenetis"
# Heslo k "ostre" databazi
REMOTE_DB_PASSWORD="freenetis"

# Uzivatel pro pristup na "ostry" freenetis pres SSH
REMOTE_USER="root"
# Adresa "ostreho" freenetisu pro SSH
REMOTE_HOST="host"

############################################################################################
#                    S A M O T N Y   S K R I P T   -   N E M E N I T !                     #
############################################################################################

echo "Vytvarim zalohu lokalni databaze $LOCAL_DB_NAME..."
mysqldump -u $LOCAL_DB_USER --password=$LOCAL_DB_PASSWORD $LOCAL_DB_NAME --routines > freenetis-backup-`date +%Y%m%d%H%M`.sql 2>/dev/null

echo "Odstranuji lokalni databazi $LOCAL_DB_NAME..."
mysql -u $LOCAL_DB_USER --password=$LOCAL_DB_PASSWORD -e "DROP DATABASE $LOCAL_DB_NAME;"

echo "Vytvarim novou prazdnou databazi $LOCAL_DB_NAME..."
mysql -u $LOCAL_DB_USER --password=$LOCAL_DB_PASSWORD -e "CREATE DATABASE $LOCAL_DB_NAME DEFAULT CHARACTER SET utf8 COLLATE utf8_czech_ci;"

echo "Importuji do ni data primo z ostre databaze, tato operace chvili potrva..."
ssh $REMOTE_USER@$REMOTE_HOST "mysqldump -u $REMOTE_DB_USER --password=$REMOTE_DB_PASSWORD $REMOTE_DB_NAME --routines" | mysql -u $LOCAL_DB_USER --password=$LOCAL_DB_PASSWORD $LOCAL_DB_NAME

echo "Nastavuji protokol na $PROTOCOL..."
mysql -u $LOCAL_DB_USER --password=$LOCAL_DB_PASSWORD $LOCAL_DB_NAME -e "update config set value = '$PROTOCOL' where name = 'protocol';"

echo "Nastavuji domenu na $DOMAIN..."
mysql -u $LOCAL_DB_USER --password=$LOCAL_DB_PASSWORD $LOCAL_DB_NAME -e "update config set value = '$DOMAIN' where name = 'domain';"

echo "Nastavuji suffic na $SUFFIX..."
mysql -u $LOCAL_DB_USER --password=$LOCAL_DB_PASSWORD $LOCAL_DB_NAME -e "update config set value = '$SUFFIX' where name = 'suffix';"

echo "Nastavuji vsem uzivatelum stejne heslo jako je heslo pro uzivatele $USER_LOGIN..."
mysql -u $LOCAL_DB_USER --password=$LOCAL_DB_PASSWORD $LOCAL_DB_NAME -e "update users, (select password as newpass from users where login='$USER_LOGIN') u set password = u.newpass"

echo "Vyprazdnuji e-mailovou frontu..."
mysql -u $LOCAL_DB_USER --password=$LOCAL_DB_PASSWORD $LOCAL_DB_NAME -e "TRUNCATE TABLE  email_queues;"