Table of Contents

MySQL

Backup

Simple //naive// backup

Back up all databases into one file at once is a bad idea.

  1. If there is a single problem (corrupted table, unreadable file, whatever), the rest of DB will not be dumped
  2. Restoring one DB within many from one file is difficult, time consuming and with slightly bigger databases ~ 10GB i wish you a lot of RUM

Here is an example anyway

mysqldump -u root -p --all-databases > all_db_backup.sql

In a script

mysqldump -u root --password="my_secret" --all-databases > all_db_backup.sql

If you are going to use this simple and not so clever backup, please at least make the file root readable only.

Better way

The backup user just need lock and read privileges. Create a backup user and grant lock tables and select privileges to it with the following MariaDB/MySQL commands

GRANT LOCK TABLES, SELECT ON *.* TO 'backupuser'@'localhost' IDENTIFIED BY 'some_passwd';
FLUSH privileges;

Then list all databases and in backup one after another. Use umask to keep you files root readable only. Here is our script for 7 days rotating backups.

DAY=$(date +"%w")
BACKUP_TMP="/some_storage/db/mysql-${DAY}"
PASS="some_passwd"
USR="backupuser"
 
umask 077
mkdir -p $BACKUP_TMP
 
mysql -u $USR  --password=$PASS -Bse "SHOW DATABASES" | while read DB ; do
        mysqldump --no-tablespaces --single-transaction -u $USR --password=$PASS ${DB} | bzip2 > $BACKUP_TMP/${DB}.sql.bz2
done

Replication

Correcting an error

Chyba:

phpmyadmin nemohl neco neco neco

Reseni:

stop slave;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;
start slave;

show slave status \G
....: YES
....: YES 

What replication is not

Source: http://www.databasejournal.com/features/mysql/article.php/3355201/Database-Replication-in-MySQL.htm

Moving to another server

First import mysql tables whith all users

mysql -u root -p mysql <temp/mysql.sql 

Then you can do flush privileges or use the old password. Finaly import all databases

cd /srv/temp
for i in *; do 
   db=${i%%.sql};
   echo $db;
   mysqladmin create $db --password=xxxxx;
   mysql -u root --password=xxxxxx $db <$i;
done

unfortunately in the middle the cycle failed (i caused it intentionaly)

X=0
for i in *; do
   test $X -eq 0 && mv $i $i.done;
   if [ $i = 'gld.sql' ]; then
     X=1;
   fi;
done

Reparing Tables

mysql> CHECK TABLE fixtures;
mysql> REPAIR TABLE fixtures;
mysql> REPAIR TABLE fixtures USE_FRM;

Performance

Regain root access

From http://www.simplehelp.net/2008/11/26/how-to-reset-a-lost-mysql-root-password/

# /etc/init.d/mysql stop
# mysqld_safe --skip-grant-tables &
# mysql -u root

mysql> use mysql;
mysql> update user set password=PASSWORD("NewMySQLPassword") where User="root";
mysql> flush privileges;
mysql> quit 

# /etc/init.d/mysql stop
# /etc/init.d/mysql start

Tunning

max_connections        = 500


innodb_buffer_pool_dump_at_shutdown = 0
innodb_buffer_pool_dump_pct = 100
innodb_buffer_pool_instances = 8
innodb_buffer_pool_load_at_startup = 0
innodb_buffer_pool_size = 220G
innodb_log_file_size = 5G
thread_cache_size = 500
thread_pool_size = 12
innodb_read_io_threads = 64
innodb_write_io_threads = 64

tmp_table_size = 12G
max_heap_table_size = 12G

skip-name-resolve

query_cache_type = 0
query_cache_limit = 128M
query_cache_min_res_unit = 4k
query_cache_size = 0

max_allowed_packet = 1G

key_buffer_size = 64M

aria_pagecache_buffer_size = 1G

back_log = 500
sort_buffer_size = 2M

join_buffer_size = 4M
table_open_cache = 10000
performance_schema = ON

innodb_flush_log_at_trx_commit = 2
innodb_lru_scan_depth = 128
innodb_autoinc_lock_mode = 2

#skip-log-error = OFF

slave-skip-errors=all