Rebuild Slave-DB & Replication Since the mysqldump command locks the tables, it is not necessary that there is no traffic on the master database. With --master-data the command mysqldump stores the correct position for inserting the replication on the slave server. If the hard disk of the slave is full, please refer to the instructions on this page below - "Slave Disk Full". - Login to slave server
Login to MySQL with credentials USER and PWD, then stop slave and leave MySQL again. Use the following commands for this: Translations Ignore |
---|
mysql -uUSER -pPWD
STOP SLAVE;
RESET SLAVE;
QUIT;
|
Restart MySQL Server with the following command: .- on Debian Server: service mysql restart
Write a MySQL dump. Now perform the following steps on the master server. Create a backup directory and change to the same. The MySQL dumb is now executed with the following command mysqldump -uUSER -pPWD --single-transaction --master-data=2 --databases JTELWeb JTELStats JTELLog --add-drop-database --add-drop-table --events --routines --triggers > filename.sql
As of release 3.12 the following command is required: mysqldump -uUSER -pPWD --single-transaction --master-data=2 --databases JTELWeb JTELStats JTELStats2 JTELLog --add-drop-database --add-drop-table --events --routines --triggers > filename.sql
Here is a brief explanation of this: - <Name LogFile> and <Position LogFile> are saved through --master-data in the dump
- use only the JTEL databases '--databases'
- delete all databases before import '--add-drop-database'
- delete all tables of the databases before import '--add-drop-table'
- Implement all routines and procedures in the dump '--events --routines'
- Additionally the parameter --default_character_set utf8 can be used
Warning |
---|
In versions 3.12, 3.14 and 3.15 If someone logs on to the portal while the dump is being pulled, it will go wrong. Enclosed a SQL query. If the time changes after executing the query, a login has taken place. If this happens, the dump has to be pulled again and in the meantime it has to be permanently checked if a login has taken place. Only if this is not the case, the dump can be replicated error-free to the slave. SELECT Max(dtAcdLoggedIn) FROM Users; In versions 3.11 and below and version 3.16 this problem does not exist. |
- Copy MySQL dump from master database server to slave database server
Use the tool of your choice: command line (scp), WinSCP, ...
We switch back to the slave server and now import the mysqldump. Translations Ignore |
---|
mysql -uUSER -pPWD (we are now in MySql)
SET foreign_key_checks = 0;
drop database JTELLog;
drop database JTELStats;
drop database JTELWeb;
drop database JTELStats2;
SET foreign_key_checks = 1;
source <filename>;
|
- We are now determining the replication parameters, as we will need them in a moment:
- In the mysqldump file at the very beginning we find a line in the comment block that looks like this:
CHANGE MASTER TO MASTER_LOG_FILE='binlog.000872', MASTER_LOG_POS=11940974;Memorize the parameters MASTER_LOG_FILE und MASTER_LOG_POS . - We need the name or IP of the Master DB Server
- We need the password of user
repl on the Master DB Server. This is usually always the password of the user root - the easiest way to try it is to log on from the slave to the master with this password: mysql -h <masterIP> -u repl -p<Passwort> - if this works, then you know.
- Now on the slave server there is already a consistent, fairly new state of the data. It is now only necessary to reconfigure the replication. The following commands do this:
mysql -uUSER -pPWD
CHANGE MASTER TO MASTER_HOST='<name or ip of master servers>',MASTER_USER='repl',MASTER_PASSWORD='<passwort>',MASTER_LOG_FILE='<Name LogFile>', MASTER_LOG_POS=<Position LogFile>; Here all parameters must be replaced with those from step 5.
Now we check the slave status (a few times) with the command
and expect the following result:
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Now the replication is running again. The name of the logfile and the position should promptly correspond pretty much to the show master status on the master database.
- Do not forget to clean up data garbage! I.e. delete mysqldumps and directories at least on the slave. A backup can remain on the master database, provided there is enough space.
Slave Disk FullThere are several reasons why the slave disk can become full. tmp directory is fullBackgroundEvery time a query creates a tmp table, it is written to the temp directory, usually /tmp. This happens when the maximum size exceeds the maximum "in memory" table size. This is defined with the variables tmp_table_size aswell as max_heap_table_size . See also https://dev.mysql.com/doc/refman/5.6/en/internal-temporary-tables.html for more information. The tables in /tmp are kept until the respective DB connection is closed or a DROP TEMPORARY TABLE is called. If the /tmp directory is full, it is likely that a DROP TEMPORARY TABLE is missing somewhere. This can also happen through customer queries to the DB. The installation of tmpwatch creates help in a permanent way Hints: - On CentOS 6 the /tmp directory is then by default freed from files that have not been accessed for > 10 days
- Circumstantially this may not be sufficient
- On CentOS 7 the /tmp directory is then freed by default from files that have not been accessed for> 1 day
Procedure- Space must first be made available. Just mercilessly delete everything from /tmp.
- If this provides enough space, then restart the mysql service first: service mysql restart
- If there is enough space (at least about 20%), then proceed with replication as described above.
Lots of "relay logs" availableMySQL first writes the relay logs from the master to a file. Once replication is interrupted, but the slave relay process continues to operate, the disk is filled by relay logs. This step should be done in any case, especially before the next one (ibdata too large) to make room. ProcedureThe files for the database are usually located in /var/lib/mysql If not, the location can be found in /etc/my.cnf The corresponding entry is datadir=(pfad) Alle Relay Logs löschen: Translations Ignore |
---|
cd /var/lib/mysql rm mysqld-relay-bin* |
Restart MySQL service Translations Ignore |
---|
service mysqld restart |
If enough space is available (at least 20%) then proceed with the slave recovery as described above.
ibdata files on the slave "very large"The files for the database are usually located in /var/lib/mysql Due to not clearly documented MySQL internas, the file /var/lib/mysql/ibdata1 can be huge compared to the master database. To remedy this, you have to proceed a little more rigorously. Procedure- If no less than 100% disk can be achieved by the steps above:
Unsubscribe the MySQL service from the autostart: Translations Ignore |
---|
service mysqld disable |
Restart the computer with : Translations Ignore |
---|
reboot |
Only works if less than 100% disk is reached (possibly after reboot above) then Log on to the mysql server: Translations Ignore |
---|
mysql -u root -p |
Drop all JTEL databases: Translations Ignore |
---|
SET FOREIGN_KEY_CHECKS=0; DROP DATABASE JTELLog; DROP DATABASE JTELStats; DROP DATABASE JTELWeb; SET FOREIGN_KEY_CHECKS=1; |
Press CTRL+C to return to the command line, and then Translations Ignore |
---|
service mysqld stop rm /var/lib/mysql/ibdata* rm /var/lib/mysql/ib_log_* |
Start MySql Server, and enable it again if necessary: Translations Ignore |
---|
service mysqld start service mysqld enable |
Check disk space, and proceed with Slave Restore as described above.
Still no disk space > 20% freeIn this case the slave is simply too small. The hard disk must be expanded (as with extending the STORE role, apply only to the logical volume where the MySQL database data resides). Then perform the steps again, if the disk is too small, then restore the slave as described above. Or the slave is completely rebuilt with a larger plate. |