{"id":86,"date":"2010-07-20T17:32:13","date_gmt":"2010-07-20T15:32:13","guid":{"rendered":"https:\/\/caipirinha.spdns.org\/wp\/?p=86"},"modified":"2019-09-29T22:56:10","modified_gmt":"2019-09-29T20:56:10","slug":"mysql","status":"publish","type":"post","link":"https:\/\/caipirinha.spdns.org\/wp\/?p=86","title":{"rendered":"MySQL"},"content":{"rendered":"\n<h2 class=\"wp-block-heading\">Einrichtung des MySQL-Servers auf dem Caipirinha-Server<\/h2>\n\n\n\n<p>MySQL ist f\u00fcr das vollst\u00e4ndige Funktionieren eines LAMP-Systems eine \nder Grundvoraussetzungen. Auch auf dem Caipirinha-Server ist MySQL \ninstalliert, und zwar mit den Paketen:\n<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>mysql<\/li><li>mysql-administrator<\/li><li>mysql-client<\/li><li>mysql-gui-tools<\/li><li>mysql-query-browser<\/li><li>mysql-workbench<\/li><\/ul>\n\n\n\n<p> Auf dem Caipirinha-Server wird die Datenbank f\u00fcr folgende Dienste benutzt: <\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Die <strong>Caipigallery<\/strong> (basiert auf <a href=\"http:\/\/coppermine-gallery.net\/\">coppermine<\/a>)<\/li><li>Die <a href=\"http:\/\/caipirinha.homelinux.org\/mediawiki\/\"><strong>Caipiwiki<\/strong><\/a>, also <em>diese<\/em> Wiki<\/li><li><strong>GroupOffice<\/strong><\/li><\/ul>\n\n\n\n<p> Die Konfiguration von MySQL erfolgt \u00fcber die zentrale Konfigurationsdatei <strong>\/etc\/my.cnf<\/strong>, die hier in Ausz\u00fcgen wiedergegeben ist: <\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">...\n# The following options will be passed to all MySQL clients\n[client]\n password    = your_password\n port        = 3306\n socket        = \/var\/lib\/mysql\/mysql.sock\n# Here follows entries for some specific programs\n# The MySQL server\n[mysqld]\n port        = 3306\n socket        = \/var\/lib\/mysql\/mysql.sock\n skip-locking\n key_buffer = 16M\n max_allowed_packet = 16M\n table_cache = 64\n sort_buffer_size = 512K\n net_buffer_length = 8K\n read_buffer_size = 256K\n read_rnd_buffer_size = 512K\n myisam_sort_buffer_size = 8M\n# New entries by Gabriel R\u00fceck\n datadir               = \/home\/public\/Datenbanken\n log-error             = \/var\/log\/mysql\/errors.log\n log-slow-queries      = \/var\/log\/mysql\/slow_queries.log\n log-warnings\n ft_min_word_len       =  2\n ft_max_word_len       = 40\n ft_stopword_file      = \"\"\n long_query_time       = 1\n# Set the Character Set of the server to UTF-8\n character_set_server     = utf8\n collation_server         = utf8_unicode_ci\n init_connect             ='SET character_set_connection=utf8; SET collation_connection=utf8_unicode_ci'\n# Don't listen on a TCP\/IP port at all. This can be a security enhancement,\n# if all processes that need to connect to mysqld run on the same host.\n# All interaction with mysqld must be made via Unix sockets or named pipes.\n# Note that using this option without enabling named pipes on Windows\n# (via the \"enable-named-pipe\" option) will render mysqld useless!\n#  \n# skip-networking\n \u2026\n# The safe_mysqld script\n[safe_mysqld]\n log-error=\/var\/log\/mysql\/mysqld.log\n[mysqldump]\n quick\n max_allowed_packet = 16M\n[mysql]\n no-auto-rehash\n# Remove the next comment character if you are not familiar with SQL\n# safe-updates\n \u2026<\/pre>\n\n\n\n<p>Die Parameter <strong>key_buffer<\/strong> und <strong>max_allowed_packet<\/strong> wurden \nauf 16M eingestellt, um ganze Projektpl\u00e4ne f\u00fcr MS Project abspeichern zu\n k\u00f6nnen. Solche Projektpl\u00e4ne haben gro\u00dfe bin\u00e4re Bl\u00f6cke, in denen MS \nProject propriet\u00e4re Daten speichert.\n<\/p>\n\n\n\n<p>Mit dem Parameter <strong>datadir<\/strong> werden alle Datenbanken auf dem Caipirinha-Server in das Verzeichnis <strong>\/home\/public\/Datenbanken<\/strong> gelegt, welches exklusiv dem Benutzer <em>mysql:mysql<\/em> geh\u00f6rt.\n<\/p>\n\n\n\n<p>Die Parameter <strong>log-error<\/strong>, <strong>log-slow-queries<\/strong> und <strong>log-warnings<\/strong> legen fest, dass Fehler, Warnmeldungen und lange dauernde Abfragen festgehalten werden. Die beiden Fehlerdateien <strong>\/var\/log\/mysql\/errors.log<\/strong> und <strong>\/var\/log\/mysql\/slow_queries.log<\/strong> sollten regelm\u00e4\u00dfig \u00fcberpr\u00fcft werden. In der Datei <strong>\/var\/log\/mysql\/slow_queries.log<\/strong>\n werden SQL-Abfragen festgehalten, deren Abarbeitung unbotm\u00e4\u00dfig viel \nRechenzeit in Anspruch nimmt. Eine h\u00e4ufige Ursache daf\u00fcr sind nicht \noptimal strukturierte SQL-Abfragen, in denen Tabellen verkn\u00fcpft werden. \nEine alternative Verkn\u00fcpfung mit einer <em>JOIN LEFT<\/em>-Syntax bewirkt meist Abhilfe.\n<\/p>\n\n\n\n<p>Mit den Parametern <strong>ft_min_word_len<\/strong> und <strong>ft_max_word_len<\/strong>\n legt man fest, dass f\u00fcr die Volltextsuche ein Suchbegriff mindestens 2 \nund h\u00f6chstens 40 Zeichen lang sein darf. Der leere Wert f\u00fcr <strong>ft_stopword_file<\/strong> schlie\u00dflich deaktiviert die standardm\u00e4\u00dfige Stoppwortliste.\n<\/p>\n\n\n\n<p>Mit dem Parameter <strong>long_query_time<\/strong> wird hier festgelegt, dass alle Abfragen, welche l\u00e4nger als 1s ben\u00f6tigen, als &#8220;zu lange&#8221; eingestuft werden.\n<\/p>\n\n\n\n<p>Das Verzeichnis <strong>\/var\/log<\/strong> ist nur f\u00fcr den Benutzer <strong>root<\/strong> beschreibbar. Deshalb legt man dort ein Unterverzeichnis namens <strong>mysql<\/strong>\n an, so dass MySQL in diesem Unterverzeichnis alle Log-Dateien ablegen \nund diese auch rotieren kann. Dazu muss man nun noch als Benutzer <strong>root<\/strong> folgende Kommandos ausf\u00fchren: \n<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">mkdir \/var\/log\/mysql\nchown mysql:mysql \/var\/log\/mysql<\/pre>\n\n\n\n<p>Nach diesen Anpassungen wird MySQL mit <code>\/etc\/init.d\/mysql start<\/code> gestartet.\n<\/p>\n\n\n\n<p>Jetzt muss unbedingt ein Passwort fur den Benutzer <em>root<\/em> \nauf dem MySQL-Server vergeben werden, denn im Moment kann sich noch \njeder Benutzer auf dem Caipirinha-Server mit dem MySQL-Server verbinden.\n Man beachte, dass der MySQL-Benutzer <em>root<\/em> nicht mit dem Systembenutzer <em>root<\/em> des Caipirinha-Servers identisch ist. MySQL hat seine eigenen Benutzer, und unter denen gibt es auch einen Superuser <em>root<\/em>. Mit <code>mysqladmin \u2013u root password <em>geheimes_Passwort<\/em><\/code>\n vergibt man das root-Passwort und verhindert dadurch automatisch, dass \nsich Benutzer am MySQL-Server ohne Passwort anmelden k\u00f6nnen. Das heisst,\n es obliegt nun dem MySQL-<em>root<\/em>, weitere MySQL-Benutzer einzurichten, wenn dies erforderlich ist. Das Einloggen auf dem MySQL-Server muss jetzt mit dem Befehl <code>mysql \u2013u <em>Benutzer<\/em> \u2013p <em>geheimes_Passwort<\/em><\/code> geschehen. Man kann auch das Passwort weglassen, dann wird man beim Einloggen explizit danach gefragt.\n<\/p>\n\n\n\n<p>MySQL hat seine eigene Sprache und Syntax, und an dieser Stelle sollen nur einige elementare Dinge vorgestellt werden.\n<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Elementare MySQL-Befehle<\/h2>\n\n\n\n<p>Im einem nun folgenden Beispiel werden folgende Dinge gezeigt:\n<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Ein Benutzer loggt sch als als MySQL-Benutzer <em>root<\/em> ein.<\/li><li>Der nun als <em>root<\/em> eingeloggte MySQL-Benutzer l\u00e4sst sich alle Datenbanken anzeigen.<\/li><li>Dann w\u00e4hlt er die MySQL-Systemdatenbank <strong>mysql<\/strong> aus (welche schon bei der Installation eingerichtet wird).<\/li><li>Er l\u00e4sst sich eine \u00dcbersicht aller Tabellen der Datenbank <strong>mysql<\/strong> geben.<\/li><li>Er l\u00e4sst sich die Tabelle <strong>user<\/strong> n\u00e4her beschreiben.<\/li><li>Aus der Tabelle <strong>user<\/strong> l\u00e4sst er sich alle Benutzer anzeigen.<\/li><li>Danach loggt sich der MySQL-Benutzer <em>root<\/em> wieder aus.<\/li><\/ul>\n\n\n\n<p>Wie in der Literatur \u00fcblich, werden die MySQL-Befehle in Gro\u00dfbuchstaben geschrieben. Dies ist aber nicht notwendig.\n<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">caipirinha:~ # mysql -uroot -p\nEnter password:\nWelcome to the MySQL monitor.  Commands end with\u00a0; or \\g.\nYour MySQL connection id is 25\nServer version: 5.1.36 SUSE MySQL RPM\n\nType 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.\n\nmysql> SHOW DATABASES;\n+--------------------+\n| Database           |\n+--------------------+\n| information_schema |\n| CCPM_Test          |\n| GroupOffice        |\n| PCBA               |\n| Wiki               |\n| coppermine         |\n| mysql              |\n| nonCCPM_Test       |\n+--------------------+\n8 rows in set (0.00 sec)\n\nmysql> USE mysql;\nDatabase changed\nmysql> SHOW TABLES;\n+---------------------------+\n| Tables_in_mysql           |\n+---------------------------+\n| columns_priv              |\n| db                        |\n| event                     |\n| func                      |\n| general_log               |\n| help_category             |\n| help_keyword              |\n| help_relation             |\n| help_topic                |\n| host                      |\n| ndb_binlog_index          |\n| plugin                    |\n| proc                      |\n| procs_priv                |\n| servers                   |\n| slow_log                  |\n| tables_priv               |\n| time_zone                 |\n| time_zone_leap_second     |\n| time_zone_name            |\n| time_zone_transition      |\n| time_zone_transition_type |\n| user                      |\n+---------------------------+\n23 rows in set (0.09 sec)\n\nmysql> DESCRIBE user;\n+-----------------------+-----------------------------------+------+-----+---------+-------+\n| Field                 | Type                              | Null | Key | Default | Extra |\n+-----------------------+-----------------------------------+------+-----+---------+-------+\n| Host                  | char(60)                          | NO   | PRI |         |       |\n| User                  | char(16)                          | NO   | PRI |         |       |\n| Password              | char(41)                          | NO   |     |         |       |\n| Select_priv           | enum('N','Y')                     | NO   |     | N       |       |\n| Insert_priv           | enum('N','Y')                     | NO   |     | N       |       |\n| Update_priv           | enum('N','Y')                     | NO   |     | N       |       |\n| Delete_priv           | enum('N','Y')                     | NO   |     | N       |       |\n| Create_priv           | enum('N','Y')                     | NO   |     | N       |       |\n| Drop_priv             | enum('N','Y')                     | NO   |     | N       |       |\n| Reload_priv           | enum('N','Y')                     | NO   |     | N       |       |\n| Shutdown_priv         | enum('N','Y')                     | NO   |     | N       |       |\n| Process_priv          | enum('N','Y')                     | NO   |     | N       |       |\n| File_priv             | enum('N','Y')                     | NO   |     | N       |       |\n| Grant_priv            | enum('N','Y')                     | NO   |     | N       |       |\n| References_priv       | enum('N','Y')                     | NO   |     | N       |       |\n| Index_priv            | enum('N','Y')                     | NO   |     | N       |       |\n| Alter_priv            | enum('N','Y')                     | NO   |     | N       |       |\n| Show_db_priv          | enum('N','Y')                     | NO   |     | N       |       |\n| Super_priv            | enum('N','Y')                     | NO   |     | N       |       |\n| Create_tmp_table_priv | enum('N','Y')                     | NO   |     | N       |       |\n| Lock_tables_priv      | enum('N','Y')                     | NO   |     | N       |       |\n| Execute_priv          | enum('N','Y')                     | NO   |     | N       |       |\n| Repl_slave_priv       | enum('N','Y')                     | NO   |     | N       |       |\n| Repl_client_priv      | enum('N','Y')                     | NO   |     | N       |       |\n| Create_view_priv      | enum('N','Y')                     | NO   |     | N       |       |\n| Show_view_priv        | enum('N','Y')                     | NO   |     | N       |       |\n| Create_routine_priv   | enum('N','Y')                     | NO   |     | N       |       |\n| Alter_routine_priv    | enum('N','Y')                     | NO   |     | N       |       |\n| Create_user_priv      | enum('N','Y')                     | NO   |     | N       |       |\n| Event_priv            | enum('N','Y')                     | NO   |     | N       |       |\n| Trigger_priv          | enum('N','Y')                     | NO   |     | N       |       |\n| ssl_type              | enum('','ANY','X509','SPECIFIED') | NO   |     |         |       |\n| ssl_cipher            | blob                              | NO   |     | NULL    |       |\n| x509_issuer           | blob                              | NO   |     | NULL    |       |\n| x509_subject          | blob                              | NO   |     | NULL    |       |\n| max_questions         | int(11) unsigned                  | NO   |     | 0       |       |\n| max_updates           | int(11) unsigned                  | NO   |     | 0       |       |\n| max_connections       | int(11) unsigned                  | NO   |     | 0       |       |\n| max_user_connections  | int(11) unsigned                  | NO   |     | 0       |       |\n+-----------------------+-----------------------------------+------+-----+---------+-------+\n39 rows in set (0.00 sec)\n\nmysql> SELECT Host,User FROM user;\n+-----------+-----------------+\n| Host      | User            |\n+-----------+-----------------+\n|\u00a0%         | gabriel         |\n| localhost | cms_user        |\n| localhost | coppermine_user |\n| localhost | go_user         |\n| localhost | lp_mis          |\n| localhost | mis             |\n| localhost | root            |\n+-----------+-----------------+\n7 rows in set (0.02 sec)\n\nmysql> QUIT;\nBye\ncaipirinha:~ #<\/pre>\n\n\n\n<p>Man erkennt mehrere Benutzer, von denen sich alle ausser <em>gabriel<\/em>\n nur auf dem Caipirinha-Server selbst einloggen k\u00f6nnen und sich nicht \nvon einer entfernten Maschine aus \u00fcber Port 3306 verbinden k\u00f6nnen. Aus \nSicherheitsgr\u00fcnden ist es grunds\u00e4tzlich zu empfehlen, die Benutzerrechte\n so weit wie m\u00f6glich einzuschr\u00e4nken. In diesem Fall darf sich nur der \nBenutzer <strong>gabriel<\/strong> auch von entfernten MySQL-Clients \u00fcber Port 3306 mit dem MySQL-Server auf Caipirinha verbinden.\n<\/p>\n\n\n\n<p>Im n\u00e4chsten Beispiel wird ein neuer Benutzer <em>test<\/em> mit dem geheimen Passwort <em>abc&#8217;<\/em> angelegt. Er bekommt uneingeschr\u00e4nkte Zugriffsrechte auf die Datenbank <strong>Wiki<\/strong>.\n Diese beiden Schritte kann man gleich in einem Schritt zusammen fassen,\n was hier auch so gemacht wird. Dann schauen wir uns die gesetzten \nRechte an und l\u00f6schen den Benutzer wieder.\n<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">mysql> GRANT ALL ON Wiki.* TO 'test' IDENTIFIED BY 'abc';\nQuery OK, 0 rows affected (0.00 sec)\n\nmysql> SHOW GRANTS FOR 'test';\n+-----------------------------------------------------------------------------------------------------+\n| Grants for test@%                                                                                   |\n+-----------------------------------------------------------------------------------------------------+\n| GRANT USAGE ON *.* TO 'test'@'%' IDENTIFIED BY PASSWORD '*0D3CED9BEC10A777AEC23CCC353A8C08A633045E' |\n| GRANT ALL PRIVILEGES ON `Wiki`.* TO 'test'@'%'                                                      |\n+-----------------------------------------------------------------------------------------------------+\n2 rows in set (0.00 sec)\n\nmysql> DROP USER 'test';\nQuery OK, 0 rows affected (0.00 sec)\n\nmysql> FLUSH PRIVILEGES;\nQuery OK, 0 rows affected (0.00 sec)<\/pre>\n\n\n\n<p>Hier wird ersichtlich, dass durch das kombinierte Anlegen des \nBenutzers eigentlich gleich zweimal Benutzerrechte vergeben werden. Zum \neinen erh\u00e4lt der Benutzer \u00fcberhaupt Zugangsrechnte zum MySQL-Server. Und\n zum zweiten erh\u00e4lt er dann uneingeschr\u00e4nkte Zugriffsrechte auf die \nDatenbank <strong>Wiki<\/strong>. Auf andere Datenbanken kann er nicht zugreifen. Man sieht au\u00dferdem, dass das Passwort verschl\u00fcsselt abgelegt wird.\n<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Backup der Datenbanken<\/h2>\n\n\n\n<p>Alle Datenbanken m\u00fcssen nat\u00fcrlich regelm\u00e4\u00dfig gesichert werden. Dazu gibt es die beiden Programme <strong>mysqldump<\/strong> und <strong>mysqlhotcopy<\/strong>, die beide ihre Vor- und Nachteile haben. Auf dem Caipirinha-Server habe ich mich f\u00fcr <strong>mysqldump<\/strong> entschieden. <strong>mysqldump<\/strong>\n erzeugt komplette SQL-Sequenzen in derselben Reihenfolge, in der man \nsie eintippen m\u00fcsste, wenn man die entsprechende Datenbank neu erstellen\n m\u00fcsste.\n<\/p>\n\n\n\n<p>Das Backup f\u00fcr den MySQL-Server ist inzwischen im allgemeinen <a href=\"http:\/\/localhost\/mediawiki\/index.php\/Backup\">Backup<\/a>-Skript\n integriert worden. Mit den folgenden Befehlen kann man in einer Shell \nbeispielsweise alle Datenbanken in einem mit gzip komprimierten Format \nsichern:\n<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">readonly MYSQL_USERNAME=user\nreadonly MYSQL_PASSWORD=geheimes_passwort\nDATABASE_LIST=$(mysql -e 'show databases' -u$MYSQL_USERNAME -p$MYSQL_PASSWORD)\nDATABASE_LIST=$(echo $DATABASE_LIST | cut -d \" \" -f2-)\nfor DATABASE in $DATABASE_LIST\n    do mysqldump -BC --hex-blob -u$MYSQL_USERNAME -p$MYSQL_PASSWORD $DATABASE | gzip -n9 > \/backup\/$DATABASE.sql.gz\ndone<\/pre>\n\n\n\n<p>Zum Wiederherstellen muss man dann lediglich die von <strong>mysqldump<\/strong> erzeugte SQL-Datei wieder mit <code>gunzip<\/code> entpacken und mit dem Befehl <code>mysql -uroot -p <em>geheimes Passwort<\/em> &lt; <em>backup_datei.sql<\/em><\/code> einlesen.\n<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Replikation von Datenbanken<\/h2>\n\n\n\n<p>Mit einer <strong>Replikation<\/strong> kann man den Datenbestand eines <strong>Slave Servers<\/strong> mit dem Datenbestand eines <strong>Master Servers<\/strong> synchronisieren. Dadurch kann man folgende Vorteile erreichen:\n<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Lastverteilung bei stark frequentierten Systemen, indem \nSchreibzugriffe auf den Master Server und Lese-Zugriffe auf einen oder \nmehrere Slave Server verlegt werden<\/li><li>Eine Art Backup-L\u00f6sung, bei der man bei Ausfall des Master Servers \ndurch Modifikation einiger Dateien relativ schnell auf den laufen Slave \nServer umschalten kann (vorausgesetzt, die Applikation unterst\u00fctzt das)<\/li><li>Daten-Synchronisation mit entfernten Standorten<\/li><\/ul>\n\n\n\n<p>Eine solche Replikation setzt also mindestens 2 MySQL-Server voraus, \nmit unterschiedlichen Server IDs. Die Versionsnummern der MySQL-Server \nsollten idealerweise die gleichen sein, ansonsten sollte der Slave \nServer stets die h\u00f6here Versionsnummer als der Master Server haben.\n<\/p>\n\n\n\n<p>Auf dem Master Server wird die Konfigurationsdatei <strong>\/etc\/my.cnf<\/strong> so modifiziert:\n<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># Replication Master Server (default)\n# binary logging is required for replication\nlog-bin         = \/var\/log\/mysql\/binlog\nmax_binlog_size = 256M\n\n# required unique id between 1 and 2^32 - 1\n# defaults to 1 if master-host is not set\n# but will not function as a master if omitted\nserver-id = 1<\/pre>\n\n\n\n<p>Au\u00dferdem wird im MySQL Master Server ein Replikationsbenutzer angelegt, und zwar mit:\n<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">mysql> GRANT REPLICATION SLAVE ON *.* TO 'Replikationsbenutzer' IDENTIFIED BY 'Replikationspasswort';<\/pre>\n\n\n\n<p><strong>Replikationsbenutzer<\/strong> und <strong>Replikationspasswort<\/strong> m\u00fcssen \nnat\u00fcrlich einen sinnvollen Benutzernamen und ein sinnvolles Passwort \nersetzt werden. Man kann den Replikationsbenutzer auch einschr\u00e4nken, \nbeispielsweise auf <code>'Replikationsbenutzer'@'10.130.25.110'<\/code>, \nwenn der Slave-Server auf einer Maschine mit der statischen IP-Adresse \n10.130.25.110 l\u00e4uft. Das erh\u00f6ht die Sicherheit etwas. Ansonsten hilft \nnur ein m\u00f6glichst kompliziertes Passwort.\n<\/p>\n\n\n\n<p>Jetzt muss man mit <code>\/etc\/init.d\/mysql restart<\/code> den \nMaster Server neu starten. Danach nimmt man ein Backup des Datenbestands\n des Master Servers vor und spielt dieses Backup im Slave Server ein. \nIdealerweise erfolgt daher der Neustart des Master Servers und das \nAnfertigen des Backups zu einer Zeit, da m\u00f6glichst wenig Datenzugriffe \nstattfinden. Ansonsten bietet die MySQL-Dokumentation <a href=\"http:\/\/downloads.mysql.com\/docs\/mysql-replication-excerpt-5.1-en.pdf\">[1]<\/a>\n noch Hinweise, wie man Datenbanken gegen Schreibzugriffe sperren kann, \nso dass konsistente Datenbest\u00e4nde gesichert werden k\u00f6nnen.\n<\/p>\n\n\n\n<p>Jetzt (nach dem Einspielen des Backups) muss man die Konfigurationsdatei <em>\/etc\/my.cnf<\/em> des Slave Servers anpassen, beispielsweise auf:\n<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"># Replication Slave (comment out master section to use this)\n#\n# To configure this host as a replication slave, you can choose between\n# two methods\u00a0:\n#\n...\n# required unique id between 2 and 2^32 - 1\n# (and different from the master)\n# defaults to 2 if master-host is set\n# but will not function as a slave if omitted\nserver-id       = 2\nmaster-host     = 172.16.0.1\nmaster-user     = \"Replikationsbenutzer\"\nmaster-password = \"Replikationspasswort\"\nmaster-port     = 3306\nreport_host     = \"caipirinha.homelinux.org\"\nreport_port     = 3306\n\n# binary logging - not required for slaves, but recommended\n#log-bin                 = \/var\/log\/mysql\/binlog\n#max_binlog_size         = 256M\nmax_relay_log_size      = 256M\nreplicate-wild-do-table = GroupOffice.%\nreplicate-wild-do-table = Wiki.%\nreplicate-wild-do-table = coppermine.%<\/pre>\n\n\n\n<p>In diesem Beispiel wird mit dem Parameter <strong>max_relay_log_size<\/strong> \ndie maximale Gr\u00f6\u00dfe der Relay-Log-Datei des Slave Servers auf 256MB \nbegrenzt. Die Relay-Log-Dateien sind die &#8220;Slave&#8221;-Version der bin\u00e4ren \nLog-Dateien des &#8220;Masters&#8221;. Der Slave Server h\u00e4lt dort fest, welche \n\u00c4nderungen des Master Servers er bereits nachvollzogen hat.\n<\/p>\n\n\n\n<p>Mit dem Parameter <strong>replicate-wild-do-table<\/strong> kann man die \nNamen einer oder mehrerer Tabellen festlegen, die repliziert werden \nsollen. Es ist hierbei m\u00f6glich, alle Tabellen einer Datenbank \nauszuw\u00e4hlen, indem man den Datenbanknamen, gefolgt von <strong>.%<\/strong> angibt.\n Man kann den Parameter auch komplett weglassen, dann werden alle \nDatenbanken repliziert. Ich halte es dann f\u00fcr sinnvoll, Namen anzugeben,\n wenn auf dem Slave Server noch andere Datenbanken liegen, die nicht aus\n einer Replikation eines Master Servers stammen, sondern die lokal \nverwaltet werden.\n<\/p>\n\n\n\n<p>Nun muss der Slave Server mit der neuen Konfiguration gestartet \nwerden, allerdings, nachdem die zuvor gesicherten Datenbanken des MAster\n Servers eingespielt worden sind.\n<\/p>\n\n\n\n<p>Es ist nicht schlimm, wenn das Aufsetzen des Slave Servers etwas \nZeit braucht, denn der Master Server schreibt ja inzwischen alle \n\u00c4nderungen in die bin\u00e4re Log-Datei, und der Slave-Server wird sich dann \nab dem Einspielen der Datenbanken alle \u00c4nderungen vom Master Server \nholen diese nachvollziehen.\n<\/p>\n\n\n\n<p>In MySQL kann man sich auf dem Master Server den Status der Replikation mit folgenden Befehlen anzeigen lassen:\n<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">mysql> SHOW MASTER STATUS;\n+---------------+----------+--------------+------------------+\n| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB |\n+---------------+----------+--------------+------------------+\n| binlog.000001 |    10941 |              |                  |\n+---------------+----------+--------------+------------------+\n1 row in set (0.00 sec)\n\nmysql> SHOW PROCESSLIST;\n+----+--------+------------------+------+-------------+------+----------------------------------------------------------------+------------------+\n| Id | User   | Host             | db   | Command     | Time | State                                                          | Info             |\n+----+--------+------------------+------+-------------+------+----------------------------------------------------------------+------------------+\n|  8 | sombra | 172.16.0.6:58988 | NULL | Binlog Dump |  157 | Has sent all binlog to slave; waiting for binlog to be updated | NULL             |\n| 24 | root   | localhost        | NULL | Query       |    0 | NULL                                                           | SHOW PROCESSLIST |\n+----+--------+------------------+------+-------------+------+----------------------------------------------------------------+------------------+\n2 rows in set (0.00 sec)\n\nmysql> SHOW SLAVE HOSTS;\n+-----------+--------------------------+------+-------------------+-----------+\n| Server_id | Host                     | Port | Rpl_recovery_rank | Master_id |\n+-----------+--------------------------+------+-------------------+-----------+\n|         2 | caipirinha.homelinux.org | 3306 |                 0 |         1 |\n+-----------+--------------------------+------+-------------------+-----------+\n1 row in set (0.00 sec)<\/pre>\n\n\n\n<p>Hier sieht man, dass ein Replikationsbenutzer namens <em>sombra<\/em> auf dem Master Server eingeloggt ist.\nAuf dem Slave Server kann man sich analog dazu den Status der Replikation mit folgenden Befehlen anzeigen lassen:\n<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">mysql> SHOW SLAVE STATUS\\G;\n*************************** 1. row ***************************\n               Slave_IO_State: Waiting for master to send event\n                  Master_Host: 172.16.0.1\n                  Master_User: sombra\n                  Master_Port: 3306\n                Connect_Retry: 60\n              Master_Log_File: binlog.000001\n          Read_Master_Log_Pos: 10941\n               Relay_Log_File: mysqld-relay-bin.000002\n                Relay_Log_Pos: 11083\n        Relay_Master_Log_File: binlog.000001\n             Slave_IO_Running: Yes\n            Slave_SQL_Running: Yes\n              Replicate_Do_DB: GroupOffice,Wiki,coppermine\n          Replicate_Ignore_DB:\n           Replicate_Do_Table:\n       Replicate_Ignore_Table:\n      Replicate_Wild_Do_Table:\n  Replicate_Wild_Ignore_Table:\n                   Last_Errno: 0\n                   Last_Error:\n                 Skip_Counter: 0\n          Exec_Master_Log_Pos: 10941\n              Relay_Log_Space: 11239\n              Until_Condition: None\n               Until_Log_File:\n                Until_Log_Pos: 0\n           Master_SSL_Allowed: No\n           Master_SSL_CA_File:\n           Master_SSL_CA_Path:\n              Master_SSL_Cert:\n            Master_SSL_Cipher:\n               Master_SSL_Key:\n        Seconds_Behind_Master: 0\nMaster_SSL_Verify_Server_Cert: No\n                Last_IO_Errno: 0\n                Last_IO_Error:\n               Last_SQL_Errno: 0\n               Last_SQL_Error:\n1 row in set (0.00 sec)\n\nERROR:\nNo query specified\n\nmysql> SHOW PROCESSLIST;\n+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------+------------------+\n| Id | User        | Host      | db   | Command | Time | State                                                                 | Info             |\n+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------+------------------+\n|  1 | system user |           | NULL | Connect |  174 | Waiting for master to send event                                      | NULL             |\n|  2 | system user |           | NULL | Connect |   44 | Has read all relay log; waiting for the slave I\/O thread to update it | NULL             |\n|  4 | root        | localhost | NULL | Query   |    0 | NULL                                                                  | SHOW PROCESSLIST |\n+----+-------------+-----------+------+---------+------+-----------------------------------------------------------------------+------------------+\n3 rows in set (0.00 sec)<\/pre>\n\n\n\n<p>Hier sieht man, dass der Slave Server derzeit auf \u00c4nderungen durch den Master Server wartet.\n<\/p>\n\n\n\n<p>Der Slave Server legt im Datenbank-Verzeichnis eine Datei namens <strong>master.info<\/strong> (Textdatei) an, in welcher wichtige Replikationsparameter aus der Konfigurationsdatei <strong>\/etc\/my.cnf<\/strong>\n des Slave Servers abgelegt werden. Existiert diese Datei, dann werden \ndie Replikationsparameter beim Start des Slave Servers nicht mehr aus <strong>\/etc\/my.cnf<\/strong> gelesen, selbst wenn sie dort ver\u00e4ndert worden sind. Will man also \u00c4nderungen wirksam machen, muss man entweder <strong>master.info<\/strong> l\u00f6schen oder die ab MySQL 6 empfohlene Syntax <code>CHANGE MASTER TO...<\/code> im MySQL-Interface anwenden.\n<\/p>\n\n\n\n<p>Ausf\u00fchrliche Informationen zum Thema Replikation finden sich ferner in <a href=\"http:\/\/downloads.mysql.com\/docs\/mysql-replication-excerpt-5.1-en.pdf\">[2]<\/a>.\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>MySQL ist f\u00fcr das vollst\u00e4ndige Funktionieren eines LAMP-Systems eine der Grundvoraussetzungen.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[35],"tags":[68],"class_list":["post-86","post","type-post","status-publish","format-standard","hentry","category-it","tag-mysql"],"_links":{"self":[{"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=\/wp\/v2\/posts\/86","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=86"}],"version-history":[{"count":1,"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=\/wp\/v2\/posts\/86\/revisions"}],"predecessor-version":[{"id":87,"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=\/wp\/v2\/posts\/86\/revisions\/87"}],"wp:attachment":[{"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=86"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=86"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/caipirinha.spdns.org\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=86"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}