Opis aktualizacji MySQL do wersji 4.* lub 5.0.*
1.
Bezpośrednia aktualizacja, sugerowana dla migracji 4.1 => 5.0
Silnik magazynujący myisam w wersji 4.1 był już na tyle rozbudowany,
że pozwalał na bezpieczną aktualizację do kolejnej większej wersji MySQL.
Uwaga:
Nie jest to jednak prawdą dla tablic typu MERGE. Najprawdopodobniej wynikną
problemy w trakcie próby aktualizacji dla tego (rzadko używanego) typu tablic.
Najlepiej wtedy pozbyć się i odtworzyć taką tablicę oraz odtworzyć
jej zawartość w procesie aktualizacji. W razie wątpliwości prosimy przeczytać
Aktualizację ze starszych wersji MySQL.
|
Dla tego kroku wymagane są dwie sesje powłoki ponieważ blokady należą
do sesji mysql.
Listing 1.1: Bezpośrednia aktualizacja z 4.1 do 5.0.* |
# quickpkg dev-db/mysql
# alias MYSQL="mysql --user=root --password="
# DATADIR=$(MYSQL --batch --raw --silent --skip-column-names \
--execute='SHOW variables LIKE "datadir";' \
| sed -e 's|datadir[ \t]||')
# mysql --user=root --password=
mysql> FLUSH TABLES WITH READ LOCK;
# tar -cjpvf ~/mysql.$(date +%F"T"%H-%M).tar.bz2 \
/etc/conf.d/mysql /etc/mysql/my.cnf "${DATADIR}"
mysql> UNLOCK TABLES;
mysql> quit
# tar -tjvf ~/mysql.*.tar.bz2
# emerge -av ">dev-db/mysql-5.0"
# dispatch-conf
# revdep-rebuild
# /etc/init.d/mysql restart
# mysql_upgrade_shell --user=root --password= \
--protocol=tcp --datadir="${DATADIR}"
# /etc/init.d/mysql restart
# unset DATADIR
# unalias MYSQL
|
2.
Rozbudowa starej wersji MySQL
Użytkownicy rozbudowujący starszą wersję (<4.0.24) MySQL najpierw muszą
zainstalować MySQL 4.0.25. Jeśli działamy już na nowszej wersji możemy ominąć
ten krok i przejść do następnego.
Listing 2.1: Rozbudowa |
# emerge -av --buildpkg "<mysql-4.1"
|
3.
Robimy kopię zapasową danych
Ważne:
Wartości wewnątrz głównych kluczy są inaczej obsługiwane w różnych wersjach
MySQL, w celu uzyskania bliższych informacji należy zapoznać się
z raportem błędu #108502, zaleca
się również przeszukanie tablic w celu znalezienia wartości "0" (zero) oraz
mniejszych oraz ich aktualizacji do wartości większych bądź równych "1".
|
Jednym z podstawowych zadań każdego administratora bazy danych jest robienie
kopii zapasowych. Zaczynamy:
Listing 3.1: Kopia awaryjna wszystkich danych |
# mysqldump \
-uroot \
-p$PASSWORD \
-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
|
Teraz powinien zostać stworzony plik o nazwie
BACKUP_MYSQL_4.0.SQL, który będzie nam dalej potrzebny do
odtworzenia danych. Dane zawarte w MySQL są napisane językiem SQL - Structured
Query Language.
Warto sprawdzić czy kopia zapasowa działa.
4.
Rozszerzanie z ostatniej wersji MySQL
Teraz stworzymy kopię pakietu (bazy danych, nie samych danych) obecnie
zainstalowanej wersji:
Listing 4.1: Kopia pakietu binarnego |
# quickpkg dev-db/mysql
|
Nadszedł czas, aby pozbyć się obecnej wersji oraz wszystkich jej danych:
Listing 4.2: Deinstalacja MySQL-a |
# /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
|
Uwaga:
Powinniśmy mieć dwie różne kopie zapasowe: jedna SQL, przenośna, pomiędzy
różnymi wersjami MySQL oraz drugą, która pozwoli szybko odzyskać bazę danych.
Więcej szczegółów na ten temat w dalszej części tego dokumentu.
|
Po usunięciu starszej instalacji MySQL, możemy zainstalować nową wersję. Warto
zauważyć, że revdep-rebuild jest niezbędny do odbudowy pakietów łączonych
z MySQL.
Listing 4.3: Kompilowanie nowych wersji plików binarnych |
# emerge -av ">mysql-4.1"
# etc-update
# revdep-rebuild
|
Teraz konfigurujemy nowo zainstalowaną wersję MySQL i restartujemy demona:
Listing 4.4: Konfiguracja MySQL-a 4.1 |
# emerge --config =mysql-4.1.
# /etc/init.d/mysql start
|
Teraz można przejść do importowania kopii zapasowej, utworzonej w punkcie 2.
Ważne:
Plik /etc/mysql/my.cnf ustawia logowanie binarne (log-bin)
jako standardowe. Zaowocuje to tym, że każde polecenie ingerujące w zawartość
lub nazwę pliku będzie logowane. Jeśli zostanie uruchomione na dużej bazie
danych (np. 1 GB lub większej), spowoduje to utworzenie niesamowicie wielkiego
pliku, który szybko rozrośnie się do rozmiarów całej partycji - zabierając cenne
miejsce. Jeśli nie dysponujemy wystarczającą przestrzenią dyskową, warto
zastanowić się nad wyłączeniem opcji logowania binarnego.
|
Ważne:
Domyślnym kodowaniem znaków dla wersji 4.1 MySQL oraz nowszych jest
utf8. Jeśli dane zawierają znaki spoza tablicy ASCII, być może będziemy
chcieli zachować oryginalne kodowanie bazy danych. Jest to możliwe, poprzez
zastąpienie wszystkich wystąpień utf8 frazą latin1 w pliku
konfiguracyjnym /etc/mysql/my.cnf. Więcej informacji znajduje się w
części poświęconej konwersji strony
kodowej.
|
Ważne:
Administracyjna baza danych mysql, zawierająca nazwy użytkowników, hasła
i inne dane, musi posiadać kodowanie utf8.
|
Starsze wersje narzędzia mysqldump mogą wyeksportować tabele w nieprawidłowej
kolejności, jeśli pojawiają się zewnętrzne klucze. Aby obejść ten problem,
należy otoczyć SQL poniższym kodem:
Listing 4.5: Obejście problemu zewnętrznych kluczy |
SET FOREIGN_KEY_CHECKS=0
SET FOREIGN_KEY_CHECKS=1
|
Kolejnym krokiem jest import kopii zapasowej.
Listing 4.6: Import kopii zapasowej SQL-a |
# cat BACKUP_MYSQL_4.0.SQL \
| mysql \
-uroot \
--password= \
-hlocalhost \
--max_allowed_packet=16M
# mysql_fix_privilege_tables \
--defaults-file=/etc/mysql/my.cnf \
--user=root \
--password=
|
Jeśli zrestartujemy demona MySQL i wszystko pójdzie zgodnie z planem, będziemy
mieli sprawnie działającą wersję 4.1.x.
Listing 4.7: Restart MySQL-a |
# /etc/init.d/mysql restart
|
Jeśli podczas procesu rozbudowy pojawią się jakiekolwiek problemy, prosimy
zgłosić je na naszej Bugzilli.
5.
Odzyskiwanie starej instalacji MySQL 4.0
Jeśli MySQL 4.1 nie spełnia oczekiwań, zawsze można wrócić do MySQL 4.0.
Listing 5.1: Powrót do przeszłości ;-) |
# /etc/init.d/mysql stop
# emerge -C mysql
# rm -rf /var/lib/mysql/ /var/log/mysql
# emerge --usepkgonly "<mysql-4.1"
# tar -xjpvf mysql.<timestamp>.tar.bz2 -C /
# /etc/init.d/mysql start
|
Ważne:
Jeśli, postępując zgodnie z tym przewodnikiem, zainstalowaliśmy inne pakiety niż
dev-db/mysql, konieczne może być skorzystanie z programu
revdep-rebuild. Uzyskamy w ten sposób pewność, że wszystkie programy
korzystają z właściwych bibliotek współdzielonych mysqlclient.
|
6.
Konwersja strony kodowej
Wprowadzenie
Ten rozdział nie jest wyczerpującym przewodnikiem zmiany strony kodowej. Jest to
raczej krótka lista uwag, o które należy pamiętać.
Konwersja bazy danych może być złożonym zadaniem, a jego trudność wzrasta wraz
ze wzrostem różnorodności przechowywanych danych. Obiekty uszeregowane i obiekty
typu blob to przykłady utrudniające przeprowadzenie konwersji.
Indeksy
W indeksach każdy znak utf-8 składa się z 3 bajtów. Same indeksy w MySQL mogą
mieć długość do 1000 bajtów (767 bajtów w tabelach InnoDB). Należy pamiętać, że
limity określone są w bajtach, podczas gdy długość kolumny jest interpretowana
jako ilość znaków.
MySQL może również tworzyć indeksy z części kolumny. Może to być
pomocne. Poniżej znajduje się kilka przykładów:
Listing 6.1: Indeksowanie przy użyciu prefiksów |
$ mysql -uroot -p'' test
mysql> SHOW variables LIKE "version" \G
*************************** 1. row ***************************
Variable_name: version
Value:
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 );
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
|
Środowisko
System musi być tak skonfigurowany, aby obsługiwał lokalizację UTF-8. Więcej
informacji na ten temat można uzyskać w dokumentach Kodowanie UTF-8 w Gentoo i Lokalizacja Gentoo Linux.
W poniższym przykładzie ustawimy zmienne środowiskowe, które pozwolą na
korzystanie z lokalizacji UTF-8 dla języka polskiego. Poniższe linie należy
dodać do pliku /etc/env.d/02locale:
Listing 6.2: /etc/env.d/02locale |
LC_ALL=pl_PL.UTF-8
LANG=pl_PL.UTF-8
|
Aby zmiany odniosły skutek w systemie, należy wykonać polecenie env-update
&& source /etc/profile.
Program iconv
Program iconv, będący częścią pakietu sys-libs/glibc, jest
wykorzystywany do konwersji plików tekstowych pomiędzy różnymi stronami
kodowymi. Można skorzystać również z pakietu app-text/recode.
Listing 6.3: Używanie programu iconv |
$ iconv -f ISO-8859-15 -t UTF-8 file1.sql > file2.sql
$ iconv -f ISO2022JP -t UTF-8 file1.sql > file2.sql
|
Program iconv może zostać wykorzystany do zmiany strony kodowej kopii
bazy sql nawet jeżeli środowisko nie jest ustawione do pracy z utf8.
Konwersja w skryptach SQL
Można wykorzystać funkcje MySQL CONVERT() i CAST(), aby dokonać
konwersji danych w naszych skryptach SQL.
Apache (serwer WWW)
Aby wykorzystać kodowanie utf-8 w serwerze Apache, należy dodać następujące
zmienne do pliku httpd.conf: AddDefaultCharset, CharsetDefault,
CharsetSourceEnc. Jeśli pliki ze źródłami html nie są zakodowane w utf-8,
konieczna jest ich konwersja przy pomocy programu iconv lub
recode.
Zawartość tego dokumentu jest rozpowszechniana na podstawie licencji Creative Commons -
Attribution / Share Alike.
|