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='nasze_hasło'" # DATADIR=$(MYSQL --batch --raw --silent --skip-column-names \ --execute='SHOW variables LIKE "datadir";' \ | sed -e 's|datadir[ \t]||') (Ten krok powinien zostać wykonany na drugiej powłoce) # mysql --user=root --password='nasze_hasło' mysql> FLUSH TABLES WITH READ LOCK; (Wracamy do pierwszej powłoki aby wykonać poniższą komendę) # tar -cjpvf ~/mysql.$(date +%F"T"%H-%M).tar.bz2 \ /etc/conf.d/mysql /etc/mysql/my.cnf "${DATADIR}" (Następujące komendy nalezy wykonać w drugiej powłoce) mysql> UNLOCK TABLES; mysql> quit (Powracamy do pierwszej powłoki aby wykonać pozostałe operacje) # 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='your_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" (Należy zaktualizować pliki konfiguracyjne, można również użyć dispatch-conf) # 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.<micro_version> # /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='hasło' \ -hlocalhost \ --max_allowed_packet=16M # mysql_fix_privilege_tables \ --defaults-file=/etc/mysql/my.cnf \ --user=root \ --password='hasło' |
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" (Należy zamienić <timestamp> na wartość, która została użyta podczas tworzenia kopii zapasowej) # 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. |
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.
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'nasze_hasło' 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 |
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, 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 |
(Z kodowania latin1 na utf8) $ iconv -f ISO-8859-15 -t UTF-8 file1.sql > file2.sql (Z kodowania dla języka japońskiego na utf8) $ 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.
Można wykorzystać funkcje MySQL CONVERT() i CAST(), aby dokonać konwersji danych w naszych skryptach SQL.
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.
Materiał udostępniany na podstawie licencji Creative Commons - Attribution / Share Alike.