Showing posts with label Xtrabackup. Show all posts
Showing posts with label Xtrabackup. Show all posts

Sunday, March 1, 2026

Does Every PXC Node Need XtraBackup Installed?

One question that surfaces regularly in the Percona forums: Does every node in a Percona XtraDB Cluster (PXC) need to have XtraBackup installed? It's a fair question, especially when managing a mixed environment or trying to minimize the software footprint on certain nodes. Here is what the actual mechanics and testing confirm.

The Short Answer (But Read On)

It depends on what you want that node to do. The nuance matters quite a bit here, so it is worth walking through how State Snapshot Transfer (SST) works in PXC and why XtraBackup's presence — or absence — on a given node is significant.

A Quick Refresher on SST in PXC

When a new node joins a Percona XtraDB Cluster, or when an existing node has been down long enough that Incremental State Transfer (IST) is no longer possible, the cluster performs a State Snapshot Transfer (SST). This is essentially a full data copy from a donor node to the joiner node.

PXC supports multiple SST methods, configured in my.cnf:

[mysqld]
wsrep_sst_method = xtrabackup-v2

The available SST methods include:

  • xtrabackup-v2 — The recommended method for PXC, using Percona XtraBackup; performs SST without locking the donor for extended periods
  • clone — Available in PXC 8.0.22+ using MySQL's built-in Clone Plugin; removes the XtraBackup dependency for SST
  • mysqldump — Slower and locks the donor during transfer; not recommended for production
  • rsync — Requires the donor to be read-only during transfer, blocking writes; also not recommended for live clusters

The xtrabackup-v2 method has historically been the default approach and remains widely used in existing deployments precisely because it keeps the donor node available for writes during the transfer. The other legacy methods can block writes on the donor, which is generally unacceptable in a production cluster. Note that Percona has been increasingly recommending the clone method for new installations on PXC 8.0.22 and later, as it removes the external tool dependency at the SST layer.

Where Does XtraBackup Need to Be Installed?

When an SST using xtrabackup-v2 is triggered, both the donor and the joiner need XtraBackup installed and accessible. Here is why both sides are involved:

  • The donor runs XtraBackup to stream the snapshot data outbound
  • The joiner runs XtraBackup — specifically the xbstream and xbcrypt utilities — to receive and apply that streamed data

If the joiner node does not have XtraBackup installed and you attempt to bring it into the cluster using xtrabackup-v2, the SST will fail. The error log on the joiner will typically show something like this:

[ERROR] WSREP: Failed to read 'ready <addr>' from: wsrep_sst_xtrabackup-v2
...
wsrep_sst_xtrabackup-v2: line 522: xbstream: command not found
[ERROR] WSREP: SST failed: 2 (No such file or directory)

That is a clear and unambiguous failure mode. If xbstream is not present on the joiner, the SST will not complete.

What About Nodes That Will Never Be a Joiner?

Technically, if a node will always act as a donor and never needs to rejoin the cluster from scratch, you could argue it only needs XtraBackup in its donor capacity. In practice, however, any node can become a joiner — after a crash, after planned maintenance, or after recovering from a network partition. There is no reliable way to guarantee a node will never need to receive an SST.

The practical guidance here is straightforward: install XtraBackup on every PXC node, without exception. The overhead of having it installed is negligible. The cost of a failed SST during an unplanned outage is not.

The Clone Plugin Alternative (PXC 8.0.22+)

Starting with PXC 8.0.22, Percona added support for the MySQL Clone Plugin as an SST method. This is worth knowing about because it removes the XtraBackup dependency for SST purposes entirely:

[mysqld]
wsrep_sst_method = clone

With the clone method, the Clone Plugin must be loaded on all nodes:

INSTALL PLUGIN clone SONAME 'mysql_clone.so';
SHOW PLUGINS WHERE Name = 'clone';
+-------+--------+-------+----------------+---------+
| Name  | Status | Type  | Library        | License |
+-------+--------+-------+----------------+---------+
| clone | ACTIVE | CLONE | mysql_clone.so | GPL     |
+-------+--------+-------+----------------+---------+

The clone method is a solid option for standardizing without XtraBackup as an SST dependency. That said, XtraBackup still has real value for your external backup strategy regardless of which SST method you choose. SST is a cluster synchronization mechanism — it is not a backup, and it should never be treated as one.

Checking Your Current SST Configuration

You can verify your current SST method and Galera-related settings with:

SHOW VARIABLES LIKE 'wsrep_sst_method';
+------------------+---------------+
| Variable_name    | Value         |
+------------------+---------------+
| wsrep_sst_method | xtrabackup-v2 |
+------------------+---------------+

To check cluster state and confirm which node may be acting as donor:

SHOW STATUS LIKE 'wsrep_local_state_comment';
+---------------------------+--------+
| Variable_name             | Value  |
+---------------------------+--------+
| wsrep_local_state_comment | Synced |
+---------------------------+--------+
SHOW STATUS LIKE 'wsrep_connected';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| wsrep_connected | ON    |
+-----------------+-------+
SHOW STATUS LIKE 'wsrep_cluster_size';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| wsrep_cluster_size | 3     |
+--------------------+-------+

Practical Observations

A few things worth noting from working with PXC environments directly:

  • The version of XtraBackup must match your PXC version. Using XtraBackup 2.x with PXC 8.0 will cause SST failures. Use Percona XtraBackup 8.0 with PXC 8.0, and confirm version alignment after any upgrade.
  • Even if you switch to the clone SST method, keep XtraBackup installed for scheduled backups. Your backup strategy and your SST method are separate concerns and should be treated as such.
  • The wsrep_sst_donor variable lets you specify a preferred donor node, which is useful for directing SST away from your busiest or most latency-sensitive member.
  • If you are running Percona Toolkit alongside PXC, be aware of how DDL replication works in your specific PXC version — Total Order Isolation (TOI) versus Rolling Schema Upgrade (RSU) behavior differs and is worth a dedicated look before running schema changes in production.

Summary

To answer the question directly: if you are using xtrabackup-v2 as your SST method — which remains the default in many existing PXC deployments — then yes, XtraBackup needs to be installed on every cluster member. Any node can be either a donor or a joiner depending on circumstances, and both roles require XtraBackup to be present when using this method.

If you are on PXC 8.0.22 or later and want to eliminate that dependency at the SST layer, the Clone Plugin method is a viable alternative and is increasingly Percona's recommended choice for new deployments. If you are starting fresh, PXC 8.4 LTS is the current long-term support release and the recommended target for new installations. Even when using clone for SST, XtraBackup remains the right tool for your actual backup jobs.

Do not try to save a few megabytes of disk space by skipping XtraBackup on select nodes. The SST failure that eventually results from that decision is not a trade-off worth making.

Resources

Friday, August 9, 2013

Create a Slave ( secondary) server with Percona Xtrabackup



So first you might just save yourself some time and read the Percona example for this:
http://www.percona.com/doc/percona-xtrabackup/2.1/howtos/setting_up_replication.html

But just in case here is an example based on a real situation.

PRIMARY SERVER

# innobackupex /tmp/  <---- this is whatever directory you want to store the backup in. This is a very basic no fluff hot backup.

InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy
.........
130809 14:40:11  innobackupex: Connection to database server closed
130809 14:40:11  innobackupex: completed OK!

Make sure you see the xtrabackup_binlog_info file. If you do not you will not easily have the position and log information. You will have to dig into the binlogs based on time and etc. Which is more work than needed.

 innobackupex --apply-log /tmp/<Timestamp Directory Here>

Now up to you. You can rsync the directory to the slave or tar[gzip] then scp to the slave. Regardless of method to move to slave, you have a hotbackup created and ready to go.


SECONDARY SERVER

# /etc/init.d/mysql stop
mv /var/lib/mysql  /var/lib/mysql_ORIG

However you moved the file from the master to the slave, put the contents into the datadir folder, assumed for example: /var/lib/mysql .

# chown -R mysql:mysql mysql
 /etc/init.d/mysql start
Starting MySQL...                                          [  OK  ]

Now in your slave MySQL server, you can set the replication user information easily.

CHANGE MASTER TO
MASTER_HOST='<MASTER_HOST>',
MASTER_USER='<MASTER_USER>',
MASTER_PASSWORD='<MASTER_PASSWORD>',
MASTER_CONNECT_RETRY = 10 ;

Get the log and position from the xtrabackup file.

# more xtrabackup_binlog_info
<BinLog info> <POSITION INFO>

CHANGE MASTER TO MASTER_LOG_FILE='<BinLog info>', MASTER_LOG_POS=<POSITION INFO>;

Start slave;


That is it in a nutshell. For more information review the Percona url given at the start. 

Saturday, June 15, 2013

Backup and Recovery Script for MySQL using Percona's innobackup and Xtrabackup

So Percona has the widely used backup tool Xtrabackup and they realize that everyone often uses this tool in a script of some kind. The have a page that talks about this:
http://www.percona.com/doc/percona-xtrabackup/2.1/xtrabackup_bin/scripting_backups_xbk.html?id=percona-xtrabackup:xtrabackup:scripting

Since I recently gave an example of how to use the backup in a previous post. I figured I might as well write a script that shows how to script the backup process. Plus it has been years since I wrote in Python so I wanted to get a little practice as well.

So the introduction to the code is below but I have placed the script on github.
It needs more testing but feel free to check the codebase out and update and edit.

Once the code is tested more I can update examples but I wanted to be open with this project from the start.

Since it is in the early stages I would recommend using the --showcommands=1 option so you can see what the code plans to do and maybe try those commands. Obviously it should not be used on a production system yet.


First an introduction to it:

# ./backup_restore.py --help
Usage: backup_restore.py  --process=[fullbackup,incremental,prepare,restore] --help --version --showcommands=1

This program enables you to backup full and incremental backups then prepare
and restore them using Percona's Xtrabackup

Options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  --process=PROCESS     What would you like to do --process=
                        [fullbackup,incremental,prepare,restore]
  --debug=DEBUG         TURN DEBUG ON 1 OR OFF 0 OR VERBOSE 3
  --showcommands=SHOWCOMMANDS
                        Shows the commands instead of executing them except
                        for the restore section because we go through that
                        step by step
  --backup_root_directory=BACKUP_ROOT_DIRECTORY
                        THE ROOT DIRECTORY OF ALL YOUR BACKUPS, You can set
                        DEFAULT at start of the script
  --percona_xtrabackup_location=PERCONA_XTRABACKUP_LOCATION
                        THE LOCATION OF YOUR xtrabackup FILE, You can set
                        DEFAULT at start of the script
  --datadir=DATADIR     MYSQL DATA DIR LOCATION, You can set DEFAULT at start
                        of the script
  --username=DB_USERNAME
                        MySQL Username, You can set DEFAULT at start of the
                        script
  --password=DB_PASSWORD
                        MySQL Password, You can set DEFAULT at start of the
                        script
  --default_file=DEFAULT_FILE
                        MySQL my.cnf file location, You can set DEFAULT at
                        start of the script
  --options=PERCONA_OPTIONS
                        Additional Options for innobackupex




Sunday, June 9, 2013

Percona Xtrabackup/innobackupex Backup and Restore process

This is a very simple example of how to use Percona Xtrabackup/innobackupex

This MariaDB just has the World Database in it as an example data.
This all could be scripted but for now it is for demo purposes.

Create a Full backup:
MariaDB [(none)]> create database Start_Of_Demo; -- Just here for the demo
Query OK, 1 row affected (0.00 sec)


[root@Fedora64 src]# innobackupex  --no-lock --parallel=4  --user=root  --extra-lsndir=/usr/local/src/incremental_last_checkpoint/  --no-timestamp /usr/local/src/fullbackup/

xtrabackup: Transaction log of lsn (1597964) to (1597964) was copied.

innobackupex: Backup created in directory '/usr/local/src/fullbackup'
130609 15:41:39  innobackupex: Connection to database server closed
130609 15:41:39  innobackupex: completed OK!

[root@Fedora64 src]# ls -al fullbackup/
total 18472
drwxr-xr-x. 6 root root     4096 Jun  9 15:41 .
drwxr-xr-x. 6 root root     4096 Jun  9 15:49 ..
-rw-r--r--. 1 root root      260 Jun  9 15:41 backup-my.cnf
-rw-r-----. 1 root root 18874368 Jun  9 15:41 ibdata1
drwxr-xr-x. 2 root root     4096 Jun  9 15:41 mysql
drwxr-xr-x. 2 root root     4096 Jun  9 15:41 performance_schema
drwxr-xr-x. 2 root root     4096 Jun  9 15:41 Start_Of_Demo
drwxr-xr-x. 2 root root     4096 Jun  9 15:41 world
-rw-r--r--. 1 root root       13 Jun  9 15:41 xtrabackup_binary
-rw-r-----. 1 root root       89 Jun  9 15:41 xtrabackup_checkpoints
-rw-r-----. 1 root root     2560 Jun  9 15:41 xtrabackup_logfile


Create an incremental backup:

MariaDB [(none)]> create database incremental_1;  -- Just here for the demo
Query OK, 1 row affected (0.00 sec)

[root@Fedora64 src]#innobackupex  --incremental --no-lock --parallel=4  --no-timestamp --user=root  --incremental-basedir=/usr/local/src/incremental_last_checkpoint/ --extra-lsndir=/usr/local/src/incremental_last_checkpoint/ /usr/local/src/incremental/

xtrabackup: Transaction log of lsn (1597964) to (1597964) was copied.

innobackupex: Backup created in directory '/usr/local/src/incremental'
130609 15:47:20  innobackupex: Connection to database server closed
130609 15:47:20  innobackupex: completed OK!

[root@Fedora64 src]# ls -al incremental
total 64
drwxr-xr-x. 7 root root  4096 Jun  9 15:47 .
drwxr-xr-x. 6 root root  4096 Jun  9 15:49 ..
-rw-r--r--. 1 root root   260 Jun  9 15:47 backup-my.cnf
-rw-r-----. 1 root root 16384 Jun  9 15:47 ibdata1.delta
-rw-r-----. 1 root root    44 Jun  9 15:47 ibdata1.meta
drwxr-xr-x. 2 root root  4096 Jun  9 15:47 incremental_1
drwxr-xr-x. 2 root root  4096 Jun  9 15:47 mysql
drwxr-xr-x. 2 root root  4096 Jun  9 15:47 performance_schema
drwxr-xr-x. 2 root root  4096 Jun  9 15:47 Start_Of_Demo
drwxr-xr-x. 2 root root  4096 Jun  9 15:47 world
-rw-r--r--. 1 root root    13 Jun  9 15:47 xtrabackup_binary
-rw-r-----. 1 root root    93 Jun  9 15:47 xtrabackup_checkpoints
-rw-r-----. 1 root root  2560 Jun  9 15:47 xtrabackup_logfile


Create another incremental backup:

MariaDB [(none)]> create database incremental_2;-- Just here for the demo
Query OK, 1 row affected (0.00 sec)

[root@Fedora64 src]# innobackupex  --incremental --no-lock --parallel=4  --no-timestamp --user=root  --incremental-basedir=/usr/local/src/incremental_last_checkpoint/ --extra-lsndir=/usr/local/src/incremental_last_checkpoint/ /usr/local/src/incremental_2/

xtrabackup: Transaction log of lsn (1597964) to (1597964) was copied.

innobackupex: Backup created in directory '/usr/local/src/incremental_2'
130609 15:49:49  innobackupex: Connection to database server closed
130609 15:49:49  innobackupex: completed OK!
[root@Fedora64 src]# ls -al incremental_2
total 68
drwxr-xr-x. 8 root root  4096 Jun  9 15:49 .
drwxr-xr-x. 6 root root  4096 Jun  9 15:49 ..
-rw-r--r--. 1 root root   260 Jun  9 15:49 backup-my.cnf
-rw-r-----. 1 root root 16384 Jun  9 15:49 ibdata1.delta
-rw-r-----. 1 root root    44 Jun  9 15:49 ibdata1.meta
drwxr-xr-x. 2 root root  4096 Jun  9 15:49 incremental_1
drwxr-xr-x. 2 root root  4096 Jun  9 15:49 incremental_2
drwxr-xr-x. 2 root root  4096 Jun  9 15:49 mysql
drwxr-xr-x. 2 root root  4096 Jun  9 15:49 performance_schema
drwxr-xr-x. 2 root root  4096 Jun  9 15:49 Start_Of_Demo
drwxr-xr-x. 2 root root  4096 Jun  9 15:49 world
-rw-r--r--. 1 root root    13 Jun  9 15:49 xtrabackup_binary
-rw-r-----. 1 root root    93 Jun  9 15:49 xtrabackup_checkpoints
-rw-r-----. 1 root root  2560 Jun  9 15:49 xtrabackup_logfile


Now you must keep this in mind.  
  • You database of course has to be shutdown. 
    • If you are doing a restore it is likely it crashed anyway
  • The Data directory must be empty.

Make sure the server is off then clear our the data directory.

[root@Fedora64 src]#  ps -ef | grep mysql
root      4538  1940  0 15:54 pts/2    00:00:00 grep --color=auto mysql

[root@Fedora64 src]# ls -al /var/lib/mysql/
total 28724
drwxr-xr-x.  8 mysql mysql     4096 Jun  9 15:53 .
drwxr-xr-x. 43 root  root      4096 Jun  8 19:41 ..
-rw-rw----.  1 mysql mysql    16384 Jun  9 15:53 aria_log.00000001
-rw-rw----.  1 mysql mysql       52 Jun  9 15:53 aria_log_control
-rw-r--r--.  1 mysql mysql 18874368 Jun  9 15:53 ibdata1
-rw-rw----.  1 mysql mysql  5242880 Jun  9 15:53 ib_logfile0
-rw-rw----.  1 mysql mysql  5242880 Jun  9 15:17 ib_logfile1
drwx------.  2 mysql mysql     4096 Jun  9 15:43 incremental_1
drwx------.  2 mysql mysql     4096 Jun  9 15:48 incremental_2
drwxr-xr-x.  2 mysql mysql     4096 Jun  9 15:16 mysql
drwxr-xr-x.  2 mysql mysql     4096 Jun  9 15:16 performance_schema
drwx------.  2 mysql mysql     4096 Jun  9 15:40 Start_Of_Demo
drwxr-xr-x.  2 mysql mysql     4096 Jun  9 15:16 world

[root@Fedora64 src]# rm -Rf /var/lib/mysql/*

Now you must keep this in mind. When you create your backups and following incremental backups, you will have to restore the full backup first and then apply all incremental backups. So DO NOT think that you can do a full backup an later just restore from the last incremental.  Always keep in mind how many incremental backups you can afford to keep before another full backup is required. 

To restore just the full backup:

innobackupex --copy-back  /usr/local/src/fullbackup/

innobackupex: Starting to copy InnoDB log files
innobackupex: in '/usr/local/src/fullbackup'
innobackupex: back to original InnoDB log directory '/var/lib/mysql'
innobackupex: Finished copying back files.

130609 15:54:57  innobackupex: completed OK!

[root@Fedora64 src]# ls -al /var/lib/mysql/
total 18456
drwxr-xr-x.  6 mysql mysql     4096 Jun  9 15:54 .
drwxr-xr-x. 43 root  root      4096 Jun  8 19:41 ..
-rw-r--r--.  1 root  root  18874368 Jun  9 15:54 ibdata1
drwxr-xr-x.  2 root  root      4096 Jun  9 15:54 mysql
drwxr-xr-x.  2 root  root      4096 Jun  9 15:54 performance_schema
drwxr-xr-x.  2 root  root      4096 Jun  9 15:54 Start_Of_Demo
drwxr-xr-x.  2 root  root      4096 Jun  9 15:54 world


[root@Fedora64 mysql]# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 1
Server version: 5.5.31-MariaDB MariaDB Server


That does the full backup but I made incremental backups after that. So it will have to be shutdown and the data directory cleaned out. Why ? You have to apply the incremental backups to the full then restore it.  It is done like the following example shows: 



innobackupex --apply-log --redo-only /usr/local/src/fullbackup/
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
130609 15:57:59  InnoDB: Starting shutdown...
130609 15:58:00  InnoDB: Shutdown completed; log sequence number 1597964
130609 15:58:00  innobackupex: completed OK!

Now let us apply the first incremental directory. You can see in the example below that the incremental_1 directory is now applied in the fullbackup directory. This was not the case earlier. 

innobackupex --apply-log --redo-only /usr/local/src/fullbackup/ --incremental-dir=/usr/local/src/incremental/
130609 15:58:42  innobackupex: completed OK!
[root@Fedora64 src]# ls -al fullbackup/
total 20520
drwxr-xr-x. 7 root root     4096 Jun  9 15:58 .
drwxr-xr-x. 6 root root     4096 Jun  9 15:49 ..
-rw-r--r--. 1 root root      260 Jun  9 15:41 backup-my.cnf
-rw-r-----. 1 root root 18874368 Jun  9 15:58 ibdata1
drwxr-xr-x. 2 root root     4096 Jun  9 15:58 incremental_1
drwxr-xr-x. 2 root root     4096 Jun  9 15:41 mysql
drwxr-xr-x. 2 root root     4096 Jun  9 15:41 performance_schema
drwxr-xr-x. 2 root root     4096 Jun  9 15:41 Start_Of_Demo
drwxr-xr-x. 2 root root     4096 Jun  9 15:41 world
-rw-r--r--. 1 root root       13 Jun  9 15:41 xtrabackup_binary
-rw-r-----. 1 root root       89 Jun  9 15:58 xtrabackup_checkpoints
-rw-r-----. 1 root root  2097152 Jun  9 15:58 xtrabackup_logfile

Now let us apply the second incremental directory. You can see in the example below that the incremental_2 directory is now applied in the fullbackup directory. This was not the case earlier. 
innobackupex --apply-log /usr/local/src/fullbackup/ --incremental-dir=/usr/local/src/incremental_2/
innobackupex: Copying '/usr/local/src/incremental_2/Start_Of_Demo/db.opt' to '/usr/local/src/fullbackup/Start_Of_Demo/db.opt'
130609 16:00:09  innobackupex: completed OK!

[root@Fedora64 src]# ls -al fullbackup/
total 20524
drwxr-xr-x. 8 root root     4096 Jun  9 16:00 .
drwxr-xr-x. 6 root root     4096 Jun  9 15:49 ..
-rw-r--r--. 1 root root      260 Jun  9 15:41 backup-my.cnf
-rw-r-----. 1 root root 18874368 Jun  9 16:00 ibdata1
drwxr-xr-x. 2 root root     4096 Jun  9 15:58 incremental_1
drwxr-xr-x. 2 root root     4096 Jun  9 16:00 incremental_2
drwxr-xr-x. 2 root root     4096 Jun  9 15:41 mysql
drwxr-xr-x. 2 root root     4096 Jun  9 15:41 performance_schema
drwxr-xr-x. 2 root root     4096 Jun  9 15:41 Start_Of_Demo
drwxr-xr-x. 2 root root     4096 Jun  9 15:41 world
-rw-r--r--. 1 root root       13 Jun  9 15:41 xtrabackup_binary
-rw-r-----. 1 root root       89 Jun  9 16:00 xtrabackup_checkpoints
-rw-r-----. 1 root root  2097152 Jun  9 15:58 xtrabackup_logfile


Now let us apply the full backup directory. You can see in the example below that the incremental_2 directory is now applied in the fullbackup directory. This was not the case earlier. 

[root@Fedora64 src]# rm -Rf /var/lib/mysql/*
[root@Fedora64 src]# innobackupex --copy-back  /usr/local/src/fullbackup/
[root@Fedora64 src]# chown -R mysql:mysql /var/lib/mysql

Everything is now restored and available:

[root@Fedora64 mysql]# mysql
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 1
Server version: 5.5.31-MariaDB MariaDB Server

Copyright (c) 2000, 2013, Oracle, Monty Program Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| Start_Of_Demo      |
| incremental_1      |
| incremental_2      |
| mysql              |
| performance_schema |
| world              |
+--------------------+

Links available for reference. 


Monday, April 29, 2013

"Tools" of the trade

I figured it might be worth creating a list of the top tools of the trade that we all use.
First and foremost this is to say thanks to everyone who helps create these tools.
Second it is to allow others who do not use these to see and learn how these can be used and why.
  • MySQL command line client. 
    • This is a given I know but it is the best access to MySQL. 
    • mysql -p --prompt="\u@\h [\d]>\_ Master >"
  • Xtrabackup
    • ./xtrabackup --defaults-file=/etc/my.cnf --backup --stats --target-dir=~/backups/  --prepare  --export --user=root --innodb_data_home_dir=/var/lib/mysql/ --innodb_data_file_path=/var/lib/mysql/ 
  • mysqlbinlog 
  • mysqltuner 
    • A good overall view into what you could have going on with your database. 
  • Percona Toolkit 
    • exampes:
      • pt-query-digest 
        • example: pt-query-digest --ask-pass /var/lib/mysql/mysql-slow.log
      • pt-table-checksum
        • example: pt-table-checksum --ask-pass
      • pt-table-sync
        • example: pt-table-sync --no-check-triggers --ask-pass --no-check-triggers --execute --print
      • pt-show-grants 
        • pt-show-grants  --ask-pass
  • MySQL Utilities 
    • exampes:
      • python mysqldiskusage --server=root:password@localhost
      • python mysqlindexcheck --server= root:password@localhost ps_helper.schema_index_statistics
      • python mysqlprocgrep --server= root:password@localhost --match-user=root
  • planet.mysql.com 
    • This might make some people question but... Knowledge is power. This is the best location to learn about MySQL. 
    • If you have to interview a MySQL DBA candidate, pick some common active authors and ask if they know who that person is. It will allow you to understand if they research the latest trends and information around MySQL or are just content with their experience.  
  • MySQL Sandbox 
  • mytop 
    • inspired by top but with a focus on MySQL
  • innotop
    • innotop is a 'top' clone for MySQL 
  • https://tools.percona.com/
    • This might also make some question. I add this because it is a quick and good way for people to get started and create a my.cnf that is better than the default installed version. If nothing else you can use it just to compare with what you think it should be. 
You might notice I am not a fan of the GUI. No offense to those GUI tools available but why GUI if you do not need it. But that is just my opinion and here is a list of GUI tools just to be fair. After all schema map is helpful and easily done with MySQL Workbench. 

Other tools for review: