Průvodce aktualizací na MySQL 4.* nebo 5.0.* Michael Kohl Francesco Riosa Jan Oppolzer MySQL tým hrdě oznamuje, že MySQL 5.0 bude brzy k nalezení ve stabilním stromu Gentoo. Tento dokument popisuje, jak aktualizovat na MySQL 4.* a 5.0.*. 1.12 2006-09-10 Přímá aktualizace, doporučená pro migraci 4.1 => 5.0

Myisam paměťový engine ve verzi 4.1 byl již dostatečně vyspělý, aby umožnil přímou aktualizaci na další majoritní verzi MySQL.

# quickpkg dev-db/mysql
# alias MYSQL="mysql --user=root --password='vaše_heslo'"
# DATADIR=$(MYSQL --batch --raw --silent --skip-column-names \
     --execute='SHOW variables LIKE "datadir";' \
     | sed -e 's|datadir[ \t]||')
# MYSQL --execute="FLUSH TABLES WITH READ LOCK;"
# tar -cjpvf ~/mysql.$(date +%F"T"%H-%M).tar.bz2 \
     /etc/mysql/conf.d/mysql /etc/mysql/my.cnf "${DATADIR}"
# MYSQL --execute="UNLOCK TABLES;"
# tar -tjvf ~/mysql.*.tar.bz2
# emerge -av ">mysql-5.0"
# dispatch-conf
# revdep-rebuild
# /etc/init.d/mysql restart
# mysql_upgrade_shell --user=root --password='vaše_heslo' \
     --protocol=tcp --datadir="${DATADIR}"
# /etc/init.d/mysql restart
# unset DATADIR
# unalias MYSQL
Aktualizace ze starých verzí MySQL

Uživatelé aktualizující ze staré verze (<4.0.24) MySQL budou muset nejdříve nainstalovat MySQL 4.0.25. Pokud již máte novější verzi, můžete tuto sekci přeskočit a pokračovat v další.

# emerge -av --buildpkg "<mysql-4.1"
Vytváření zálohy vašich současných dat

Jeden z nejdůležitějších úkolů, který musí každý administrátor databáze provádět, je zálohování dat. Vzhůru do toho:

# mysqldump \
  -uroot \
  --password='vaše_heslo' \
  -hlocalhost \
  --all-databases \
  --opt \
  --allow-keywords \
  --flush-logs \
  --hex-blob \
  --master-data \
  --max_allowed_packet=16M \
  --quote-names \
  --result-file=BACKUP_MYSQL_4.0.SQL

Nyní by měl existovat soubor pojmenovaný BACKUP_MYSQL_4.0.SQL, který může být později použit pro obnovení vašich dat. Data jsou popsána v MySQL verzi jazyka SQL, the Structured Query Language (= Strukturovaný dotazovací jazyk).

Nyní by byl také dobrý čas na zjištění, jestli záloha, kterou jste vytvořili, je funkční.

Aktualizace ze současných verzí MySQL

Pokud jste přeskočili krok #1, musíte nyní vytvořit záložní balíček (databázového serveru a nikoli dat) současné nainstalované verze:

# quickpkg dev-db/mysql

Nyní nastal čas na vyčištění současné verze a všech jejich dat:

# /etc/init.d/mysql stop
# emerge -C mysql
# tar cjpvf ~/mysql.$(date +%F"T"%H-%M).tar.bz2 /etc/mysql/my.cnf /var/lib/mysql/
# ls -l ~/mysql.*
# rm -rf /var/lib/mysql/ /var/log/mysql
Nyní by měly existovat dvě různé zálohy: První SQL, která je přenosná mezi různými verzemi MySQL, a druhá, která vám dovolí rychle obnovit vaši databázi. To bude detailněji popsáno dále v tomto dokumentu.

Poté, co jste se zbavili vaší staré MySQL instalace, můžete nyní nainstalovat novou verzi. Všimněte si, že revdep-rebuild je nezbytný pro obnovu balíčků linkovaných proti MySQL.

# emerge -av ">mysql-4.1"
(K aktualizaci konfiguračních souborů, můžete také použít dispatch-conf)
# etc-update
# revdep-rebuild

Nyní nakonfigurujte nově nainstalovanou verzi MySQL a restartujte démona:

# emerge --config =mysql-4.1.<mikro_verze>
# /etc/init.d/mysql start

Nakonec můžete importovat zálohu, kterou jste vytvořili během kroku #2.

Standardní /etc/mysql/my.cnf soubor nastavuje binární zapisování (log-bin) standardně. To bude zapisovat každou transakci, která upraví data. Máte-li velkou databázi (1GB nebo více), může to vytvořit extrémně velké soubory, které zaberou dost rychle kapacitu disku. Pokud máte málo místa, vypnutí binárního zapisování může být dobrý nápad. Standardní znaková sada v MySQL 4.1 a výše je utf8. Pokud data obsahují znaky neobsažené v ASCII, mohli byste chtít zachovat standardní znakovou sadu databáze změnou všech výskytů utf8 za latin1 v konfiguračním souboru /etc/mysql/my.cnf. Více informací můžete nalézt v kapitole Konverze znakových sad. Administrativní databáze mysql obsahuje, kromě jiných informací, uživatelská jména, hesla a musí být kódovaná v utf8.
# cat BACKUP_MYSQL_4.0.SQL \
     | mysql \
     -uroot \
     --password='vaše_heslo' \
     -hlocalhost \
     --max_allowed_packet=16M

# mysql_fix_privilege_tables \
     --defaults-file=/etc/mysql/my.cnf \
     --user=root \
     --password='vaše_heslo'

Pokud nyní restartujete vašeho MySQL démona a vše proběhne jak předpokládáno, budete mít plně funkční 4.1.x verzi! :-)

# /etc/init.d/mysql restart

Pokud se setkáte s nějakými problémy během aktualizačního procesu, prosím, oznamte je na naší Bugzille.

Obnovení staré instalace MySQL 4.0

Pokud nejste šťastní s MySQL 4.1, je možné se vrátit zpět k MySQL 4.0.

# /etc/init.d/mysql stop
# emerge -C mysql
# rm -rf /var/lib/mysql/ /var/log/mysql
# emerge --usepkgonly "<mysql-4.1"
(Změňte <časovou_značku> na tu, kterou jste použili při tvorbě zálohy.)
# tar -xjpvf mysql.<časová_značka>.tar.bz2 -C /
# /etc/init.d/mysql start
Pokud byly během následování tohoto průvodce nainstalovány jiné balíčky než dev-db/mysql, budete potřebovat spustit revdep-rebuild k ujištění, že každý klient používá správný sdílený objekt mysqlclient.
Konverze znakových sad:
Úvod

Tato kapitola není zamýšlena jako vyčerpávající průvodce pro konverzi znakových sad, ale spíše jako krátký seznam rad, podle kterých může čtenář postupovat.

Konverze databáze může být komplexní úkol s problémy vzrůstajícími s růzností dat. Věci jako serializovaný objekt a BLOB-y jsou jedním příkladem, kde je složité udržet kousky pohromadě.

Indexy

Každý znak v utf-8 je 3 bajty dlouhý s&nbps;indexem. Indexy v&nbps;MySQL mohou být až 1000 bajtů dlouhé (767 bajtů pro InnoDB tabulky). Všimněte si, že limity jsou měřeny v bajtech, kdežto velikost sloupce je interpretována jako počet znaků.

MySQL může také vytvořit indexy na částech sloupce, to může být nápomocné. Dále jsou nějaké příklady:

$ mysql -uroot -p'vaše_heslo' test

mysql> SHOW variables LIKE "version" \G
*************************** 1. row ***************************
Variable_name: version
    Value: 5.0.24-log
1 row in set (0.00 sec)

mysql> CREATE TABLE t1 (
  ->   c1 varchar(255) NOT NULL default '',
  ->   c2 varchar(255) NOT NULL default ''
  ->   ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.01 sec)

mysql> ALTER TABLE t1
  ->   ADD INDEX idx1 ( c1 , c2 );
ERROR 1071 (42000): Specified key was too long; max key length is 1000 bytes

mysql> ALTER TABLE t1
  ->   ADD INDEX idx1 ( c1(165) , c2(165) );
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> CREATE TABLE t2 (
  ->   c1 varchar(255) NOT NULL default '',
  ->   c2 varchar(255) NOT NULL default ''
  ->   ) ENGINE=MyISAM DEFAULT CHARSET=sjis;
Query OK, 0 rows affected (0.00 sec)

mysql> ALTER TABLE t2
  ->   ADD INDEX idx1 ( c1(250) , c2(250) );
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> CREATE TABLE t3 (
  ->   c1 varchar(255) NOT NULL default '',
  ->   c2 varchar(255) NOT NULL default ''
  ->   ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Query OK, 0 rows affected (0.00 sec)

mysql> ALTER TABLE t3
  ->   ADD INDEX idx1 ( c1 , c2 );
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0
Prostředí

Systém musí být nakonfigurován s podpodou zvolené UTF-8 lokalizace. Více informací najdete v naší dokumentaci: Používání UTF-8 v Gentoo a Lokalizace Gentoo Linuxu.

V tomto případě nastavíme některé proměnné shellového prostředí, abychom používali anglickou lokalizaci s UTF-8 v /etc/env.d/02locale:

LC_ALL=en_US.UTF-8
LANG=en_US.UTF-8

Poté určitě spusťtě env-update && source /etc/profile.

Program iconv

Program iconv poskytovaný sys-libs/glibc je používán pro konverzi textových souborů z jedné znakové sady do jiné. Balíček app-text/recode může být použit také.

(Z latin1 do utf8)
$ iconv -f ISO-8859-15 -t UTF-8 file1.sql > file2.sql

(Z japonštiny do utf8)
$ iconv -f ISO2022JP -t UTF-8 file1.sql > file2.sql

iconv může být použit pro překódování SQL výpisu ("dumpu") i když prostředí není nastavano na utf8.

SQL Mangling

Je možné použít MySQL funkce CONVERT() a CAST() ke konverzi dat ve vašich SQL skriptech.

Apache (webový server)

Pokud používáte utf-8 v Apachi, potřebujete přizpůsobit následující proměnné v httpd.conf: AddDefaultCharset, CharsetDefault, CharsetSourceEnc. Pokud zdrojové html soubory nejsou v utf-8, musí být překonvertovány pomocí iconv nebo recode.