Import a export databáze
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;"