ZRM for MySQL Notes Raw

*   Version installed was v2.1.1
*   **Server** is server.example.com (64-bit CentOS 6.2)
*   **Client** is client.example.com (64-bit CentOS 5.8)

Preparing the server
--------------------

    yum -y install mysql MySQL-zrm

Make a copy of, and start editing the ZRM config file.

    cp /etc/mysql-zrm/mysql-zrm.conf{,.original}

### Global Params

I edit `/etc/mysql-zrm/mysql-zrm.conf` to change the default backup
destination.

    destination=/backups/databases  
    encrypt-plugin="/usr/share/mysql-zrm/plugins/encrypt.pl"  
    decrypt-option="-d"  
    mailto="support@example.com"  
    mail-policy=always  
    html-report-directory=/var/www/html/reports/  
    html-reports=backup-status-info,backup-method-info,backup-performance-info,backup-retention-info

There are [plenty of other options
available](http://wiki.zmanda.com/index.php/How_do_I_configure_MySQL_ZRM).

### Creating a client backupset

Create a directory with whatever you want to call your backupset:

    mkdir /etc/mysql-zrm/backupset-client.example.com

Now create the client config file

    vim /etc/mysql-zrm/backupset-client.example.com/mysql-zrm.conf

I'm going to try encrypted backups. You can create a passphrase file
called `.passphrase` file in the backupset directory or define your own
name for it. I'm trying the latter option.

I added this for basic trial run:

    # MySQL connection params  
    host=client.example.com  
    user=backupser  
    password=Pas5a7hasd  
      
    # Host connection params and options  
    copy-plugin="/usr/share/mysql-zrm/plugins/ssh-copy.pl"  
      
    # Backup params  
    backup-mode=logical  
    compress=1  
    encrypt=1  
    passfile=/etc/mysql-zrm/backupset-client.example.com/passphrase  
      
    # Retention policy  
    retention-policy="10D"

Preparing the Client
--------------------

### Backup User

Make sure that your backup user [has the appropriate
privileges](http://wiki.zmanda.com/index.php/Do_I_need_to_make_changes_to_MySQL_database_configuration%3F#MySQL_backup_user).
We'll be using "support":

```sql
GRANT LOCK TABLES, SELECT, RELOAD, SUPER
ON *.* TO 'backupuser'@'backupserver.tld'
IDENTIFIED BY 'pgubSfHpm';
```

### Keyless access

ZRM will use the "mysql" user to connect. Therefore, we need to set up
keyless SSH access. On CentOS, the mysql user's homedir is `/var/lib/mysql`. So:

    cd /var/lib/mysql  
    mkdir .ssh  
    chmod 700 .ssh  
    chown mysql:mysql .ssh  
    cd .ssh  
    touch authorized_keys  
    chmod 600 authorized_keys  
    chown mysql:mysql authorized_keys  
    echo "ssh-rsa {your public key} root@server.example.com" >> authorized_keys

Now place the key of the backup server in the authorized keys file and
test a connection:

    ssh mysql@client.example.com

If you log in, you're good to go! You can alternately create another
user if you don't want to muck with the MySQL user.

Testing
-------

With the server and client configured, try this on the server.

    mysql-zrm-scheduler --now --backup-set backupset-client.example.com --backup-level 0

If all goes well, you should see a timestamped backup folder in the
backup destination (`/backups/databases` in our case) with a compressed
file called `backup-data`

### Extracting the compressed backup

**Don't use gzip!** Rather:

    mysql-zrm --action extract-backup --source-directory /backups/databases/backupset-client.example.com/20061012232713

If your backup is encrypted, decrypt it first:

    gpg --decrypt --output test.gz /backups/databases/backupset-client.example.com/20061012232713/backup-data

It's always advisable to use the ZRM restore feature first.

### Generating reports

    mysql-zrm-reporter  
      
    # To see a particular backup set  
    mysql-zrm-reporter --where backup-set=backupset-client.example.com  
      
    # Generate HTML reports (output is in backup destination dir)  
    mysql-zrm-reporter --destination /backups/databases --type html --output report.html

There are a [a lot of other options
available](http://wiki.zmanda.com/index.php/Mysql-zrm-reporter). I
wanted global reports and set this in my crontab:

    30 4 * * *  cd /var/www/html/zrm && /usr/bin/mysql-zrm-reporter --destination /backups/databases/ --type html --output index.html --show backup-status-info,backup-method-info,backup-performance-info,backup-retention-info  >> /dev/null 2>&1

### Validation

    mysql-zrm --action verify-backup --backup-set backupset-client.example.com

### [Scheduling](http://wiki.zmanda.com/index.php/Mysql-zrm-scheduler)

    # Schedule daily at 1:30PM  
    mysql-zrm-scheduler --add --interval daily --start 13:30 --backup-set backupset-client.example.com  
      
    # View all scheduled jobs  
    mysql-zrm-scheduler --query  
      
    # Remove the scheduled job  
    mysql-zrm-scheduler --delete -interval daily --start 13:30 --backup-set backupset-client.example.com

This is added to crontab.

### Rotating Backups

Set the retention policy for a given backup set and run this against
your backup destination:

    mysql-zrm --action purge --destination /backups/databases/

See your crontab. All purge jobs run at 4:00AM (granularity is one day.)

Plugins
-------

These are installed in `/usr/share/mysql-zrm/plugins`. Some good stuff!

Errors and Miscellaneous
------------------------

### Ubuntu

The MySQL user's homedir on Ubuntu is `/nonexistent`. While this makes
sense, you may want to change this for keyless access.

### mysql-bin.00000x: Cannot stat: No such file or directory

Make sure that this is uncommented in your global or client configs:

    mysql-binlog-path="/var/log/mysql"

Make sure that the `log-bin` directive in your client config is set.

### ERROR 1381 (HY000) at line 1: You are not using binary logging

Edit `my.cnf` to add this line:

    log-bin=/var/log/mysql/mysql-bin.log

Make sure that the folder exists and has the right permissions:

    mkdir /var/log/mysql  
    chown mysql:mysql /var/log/mysql  
    service mysqld restart

### Lost connection to MySQL server at 'reading initial communication packet', system error: 111

This is because:

*   Your firewall might be blocking connections
*   The MySQL user specified doesn't have the right privileges (e.g.
    does `backupuser@backupserver.tld` have privileges? Or did you
    set `backupser@localhost`?)
*   The `bindaddress` in `my.cnf` must be set to your target's IP and
    *not* `127.0.0.1`
*   The `skip-networking` option is set in `my.cnf`

Sources
-------

*   [MySQL ZRM Users Manual](http://wiki.zmanda.com/index.php/Zmanda_Recovery_Manager_for_MySQL_Users_Manual)