Gentoo Logo

Upgrade Leitfaden zu MySQL 4.* oder 5.0.*

Inhalt:

1.  Direktes Upgrade, empfohlen für den Wechsel von 4.1 => auf 5.0

Die "Myisam storage engine" in Version 4.1 war bereits ausgereift genug, um ein direktes Upgrade auf die nächste Major-Version von MySQL zu erlauben.

Notiz: Das gilt nicht für MERGE-Tables. Sie werden wahrscheinlich in Probleme geraten, wenn Sie ein direktes Upgrade für diesen selten genutzen Tabellen-Typen versuchen. Sie sollten diese Tabellen sichern und neu erstellen und ihren Inhalt im Upgradeprozess wiederherstellen. Wenn Sie unsicher sind, sollten sie mit Von einer alten MySQL-Version upgraden beginnen.

Für diesen Schritt werden 2 Shells benötigt, da eine während des Upgrade-Prozesses gesperrt wird.

Befehlsauflistung 1.1: Direktes Upgrade von 4.1 auf 5.0.*

# quickpkg dev-db/mysql
# alias MYSQL="mysql --user=root --password='Ihr_Passwort'"
# DATADIR=$(MYSQL --batch --raw --silent --skip-column-names \
  --execute='SHOW variables LIKE "datadir";' \
  | sed -e 's|datadir[ \t]||')

(Der nächste Schritt sollte in der zweiten Shell ausgeführt werden.)
# mysql --user=root --password='Ihr_Passwort'
mysql> FLUSH TABLES WITH READ LOCK;

(Kehren Sie zur ersten Shell zurück, um diesen Befehl auszuführen.)
# tar -cjpvf ~/mysql.$(date +%F"T"%H-%M).tar.bz2 \
  /etc/conf.d/mysql /etc/mysql/my.cnf "${DATADIR}"

(Die folgenden Befehle sollten wieder in der zweiten Shell ausgeführt werden.)
mysql> UNLOCK TABLES;
mysql> quit

(Kehren Sie für den Rest des Upgrades zur ersten Shell zurück.)
# tar -tjvf ~/mysql.*.tar.bz2i
# emerge -av ">dev-db/mysql-5.0"
# dispatch-conf
# revdep-rebuild
# /etc/init.d/mysql restart
# mysql_upgrade_shell --user=root --password='Ihr_Passwort' \
    --protocol=tcp --datadir="${DATADIR}"
# /etc/init.d/mysql restart
# unset DATADIR
# unalias MYSQL

2.  Von einer alten MySQL-Version upgraden

Benutzer die von einer alten Version (<4.0.24) von MySQL aus upgraden, müssen zuerst MySQL 4.0.25 installieren. Wenn Sie bereits eine aktuellere Version einsetzen, können Sie diesen Abschnitt überspringen und mit dem nächsten fortfahren.

Befehlsauflistung 2.1: Einfaches Upgrade

# emerge -av --buildpkg "<mysql-4.1"

3.  Ein Backup Ihrer aktuellen Daten anlegen

Wichtig: Werte in Primärschlüsseln werden unterschiedlich von den verschiedenen MySQL-Versionen gehandhabt. Mehrere Informationen finden Sie unter Bug #108502. Es wird strengstens empfohlen, dass Sie ihre Tabellen nach Werten von "0" (Null) oder weniger durchsuchen und Sie auf einen Wert größer oder gleich "1" setzen.

Eine der wichtigsten Aufgaben die jeder Datenbank-Administrator durchführen muss ist die Sicherung von Daten. Fangen wir an:

Befehlsauflistung 3.1: Dump aller Datenbanken

# mysqldump \
  -uroot \
  --password='Ihr_Passwort' \
  -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

Es sollte nun eine Datei mit dem Namen BACKUP_MYSQL_4.0.SQL existieren, die später genutzt werden kann, um Ihre Daten wiederherzustellen. Die Daten sind im MySQL-Dialekt der SQL (Structured Query Language) beschrieben.

Jetzt ist auch ein guter Zeitpunkt zu überprüfen, ob das Backup, das Sie gerade erstellt haben, funktioniert.

4.  Von einer aktuelleren MySQL-Version upgraden

Wenn Sie Schritt #1 übersprungen haben, sollten Sie jetzt ein Backup-Paket (des Servers, nicht der Daten) der installierten Version erstellen:

Befehlsauflistung 4.1: Backup des Binär-Pakets

# quickpkg dev-db/mysql

Jetzt ist es an der Zeit die aktuelle Installation mit allen seinen Daten zu löschen:

Befehlsauflistung 4.2: Deinstallieren von MySQL

# /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

Notiz: Nun sollte es zwei Backups geben: Das SQL-Backup, welches zwischen den verschiedenen MySQL-Versionen portabel ist, und das andere, welches Ihnen erlaubt, Ihre Datenbank schnell wiederherzustellen. Dies wird später noch genauer erklärt.

Nachdem Sie Ihre alte MySQL-Installation losgeworden sind, können Sie die neue Version installieren. Beachten Sie, dass es notwendig ist revdep-rebuild zu verwenden, um Pakete erneut zu kompilieren, die gegen MySQL gelinkt sind.

Befehlsauflistung 4.3: Aktualisieren der Programmdateien

# emerge -av ">mysql-4.1"
(Aktualisieren Sie Ihre Konfigurationsdateien, eventuell wollen Sie dispatch-conf verwenden.
# etc-update
# revdep-rebuild

Konfigurieren Sie nun die neu installierte MySQL-Version und starten Sie den Daemon neu:

Befehlsauflistung 4.4: Basiskonfiguration von MySQL 4.1

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

Abschließend können Sie die Daten aus dem Backup, das Sie in Schritt #2 erstellt haben, importieren.

Wichtig: Die Standarddatei /etc/mysql/my.cnf setzt standardmäßig das binäre Protokollieren (log-bin). Dies wird jede einzelne Transaktion, welche Daten verändert, aufzeichnen. Wenn Sie eine sehr große Datenbank (1GB oder mehr) betreiben, könnte dies extrem große Dateien schaffen, welche ziemlich schnell Festplattenspeicher belegen. Wenn Ihnen wenig Speicher zur Verfügung steht, kann es hilfreich sein, binäres Protokollieren zu deaktivieren.

Wichtig: Der Standardzeichensatz in MySQL 4.1 und höher ist utf8. Wenn Ihre Daten nicht-ASCII-Zeichen enthalten, möchten Sie vielleicht den Standardzeichensatz Ihrer Datenbank beibehalten und sollten deshalb alle Vorkommen von utf8 mit latin1 in der Datei /etc/mysql/my.cnf ersetzen. Weitere Informationen zu diesem Thema finden Sie im Kapitel Charakterset-Konvertierung.

Wichtig: Die administrative mysql Datenbank, welche u.a. Benutzernamen und Passwörter enthält, ist und muss in utf8 kodiert sein.

Ältere mysqldump-Werkzeuge werden ihre Tabellen eventuell in der falschen Reihenfolge exportieren, wenn "foreign keys" einbezogen werden. Um dieses Problem zu umgehen, schreiben Sie folgende Befehle in ihr SQL:

Befehlsauflistung 4.5: Überprüfungen der foreign keys umgehen

 SET FOREIGN_KEY_CHECKS=0
 SET FOREIGN_KEY_CHECKS=1

Als nächstes importieren Sie das Backup.

Befehlsauflistung 4.6: Importieren des SQL-Backups

# cat BACKUP_MYSQL_4.0.SQL \
     | mysql \
     -uroot \
     --password='Ihr_Passwort' \
     -hlocalhost \
     --max_allowed_packet=16M

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

Wenn Sie Ihren MySQL-Daemon nun neustarten und alles wie erwartet verläuft, haben Sie eine voll funktionsfähige Version 4.1.x.

Befehlsauflistung 4.7: Den MySQL-Daemon neustarten

# /etc/init.d/mysql restart

Wenn Sie irgendwelche Probleme während des Upgrade-Vorgangs hatten, schreiben Sie bitte einen Bugreport in unserem Bugzilla.

5.  Ihre alte MySQL 4.0 Installation wiederherstellen

Wenn Sie mit MySQL 4.1 nicht glücklich sind, ist es möglich Ihre MySQL 4.0 Installation wiederherzustellen.

Befehlsauflistung 5.1: Zu einer älteren Version zurückkehren

# /etc/init.d/mysql stop
# emerge -C mysql
# rm -rf /var/lib/mysql/ /var/log/mysql
# emerge --usepkgonly "<mysql-4.1"
(Ersetzen Sie <timestamp> mit dem, der genutzt wurde, als der Tarball erstellt wurde.)
# tar -xjpvf mysql.<timestamp>.tar.bz2 -C /
# /etc/init.d/mysql start

Wichtig: Wenn Pakete ungleich dev-db/mysql installiert wurden, müssen Sie revdep-rebuild ausführen, um zu gewährleisten, dass jeder Client das richtige mysqlclient Shared-Object benutzt.

6.  Zeichensatz Konvertierung

Einleitung

Dieses Kapitel ist nicht als ein ausgiebiger Leitfaden zum Konvertieren von Zeichensätzen bestimmt, sondern eher als eine kurze Liste von Tipps, die der Leser ausarbeiten kann.

Eine Datenbank zu konvertieren kann eine komplizierte Aufgabe sein, deren Schwierigkeit sich mit zunehmenden Datenvarianten erhöht. Dinge wie Serialized Objects und Blobs sind ein Beispiel für die Schwierigkeit, Teile beisammen zu halten.

Indexe

Jedes UTF-8 Zeichen ist genauer betrachtet 3 Bytes lang. Indexe in MySQL können bis zu 1000 Byte lang sein (767 Byte bei InnoDB-Tabellen). Beachten Sie, dass die Grenzen in Byte gemessen werden, im Gegensatz zu der Länge einer Spalte, die in Anzahl von Zeichen interpretiert wird.

MySQL kann außerdem Indexe auf Teile von Spalten erstellen. Dies kann eventuell eine Hilfe darstellen. Folgend ein paar Beispiele:

Befehlsauflistung 6.1: Benutzung von Indexen

$ mysql -uroot -p'Ihr_Passwort' 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

Umgebung

Das System muss so konfiguriert werden, dass es die UTF-8 Locale unterstützt. Weitere Informationen hierzu finden Sie in unseren Dokumenten UTF-8 unter Gentoo und Anleitung zur Lokalisierung.

In diesem Beispiel verändern und setzen wir einige Umgebungsvariablen in /etc/env.d/02locale, um die englische UTF-8 Locale zu benutzen.

Befehlsauflistung 6.2: /etc/env.d/02locale

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

Stellen Sie sicher, dass Sie env-update && source /etc/profile nach dem obrigen Schritt ausführen!

iconv

iconv, enthalten in sys-libs/glibc, wird benutzt um Textdateien von einem Zeichensatz in ein anderes zu konvertieren. Das Paket app-text/recode kann dazu ebenfalls benutzt werden.

Befehlsauflistung 6.3: Using iconv

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

(Von Japanisch auf utf8)
$ iconv -f ISO2022JP -t UTF-8 file1.sql > file2.sql

iconv kann auch benutzt werden, um ein SQL-Dump neu zu schreiben, sogar wenn die Umgebung nicht auf utf8 eingestellt ist.

SQL Methode

Es ist möglich, die MySQL-Funktionen CONVERT() und CAST() zu benutzen, um Daten innerhalb ihrer SQL-Skripte zu konvertieren.

Apache (Webserver)

Wenn Sie utf-8 mit Apache benutzen möchten, müssen Sie die folgenden Variablen in Ihrer httpd.conf anpassen: AddDefaultCharset, CharsetDefault, CharsetSourceEnc. Wenn Ihre HTML-Quelldateien nicht in utf8 kodiert sind, müssen Sie mit iconv oder recode konvertiert werden.



Drucken

Seite aktualisiert 4. Juni 2007

Die Originalversion dieser Übersetzung wird nicht länger gepflegt

Zusammenfassung: Das MySQL-Team ist stolz ankündigen zu können, dass MySQL 5.0 bald im Gentoo stable-Zweig verfügbar sein wird. Dieses Dokument erklärt, wie man auf MySQL 4.* und 5.0.* aktualisiert.

Michael Kohl
Autor

Francesco Riosa
Autor

Stefan Becker
Übersetzer

Timo Josten
Übersetzer

Donate to support our development efforts.

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