Gentoo Logo

Opis aktualizacji MySQL do wersji 4.* lub 5.0.*

Spis treści:

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.

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'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

Ś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

(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.

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.



Drukuj

Zaktualizowano 4 czerwca 2007

Podsumowanie: Zespół MySQL Gentoo z dumą ogłasza, że MySQL 5.0 będzie wkrótce dostępne w stabilnej gałęzi drzewa portage. Ten dokument opisuje jak dokonać aktualizacji do wersji 4.* oraz 5.0.*

Michael Kohl
Autor

Francesco Riosa
Autor

Dawid Węgliński
Tłumaczenie

Waldemar Korłub
Tłumaczenie

Donate to support our development efforts.

Support OSL

Support OSL

Gentoo Centric Hosting: vr.org

VR Hosted

Tek Alchemy

Tek Alchemy

SevenL.net

SevenL.net

Global Netoptex Inc.

Global Netoptex Inc.

Linux World Expo

Linux World Expo

Copyright 2001-2008 Gentoo Foundation, Inc. Questions, Comments? Contact us.