diff --git a/elements/mysql-migration/README.md b/elements/mysql-migration/README.md new file mode 100644 index 00000000..c106d135 --- /dev/null +++ b/elements/mysql-migration/README.md @@ -0,0 +1,41 @@ +Migrate data from another MySQL server into the local one using +os-config-applier and os-refresh-config. + +Please note the migration process is *destructive* to any data currently +in the MySQL database running on the target host. Safeguards are in +place to ensure the process only happens once on any machine. + +Configuration +------------- + +Pass in Heat Metadata with the following structure in the +OpenStack::Config sub-key. + + mysql: + users: + root: + username: rootuser + password: XXXXXXX + dump: + username: dumpuser + password: XXXXXXX + mysql-migration: + bootstrap_host: x.y.z + slave_user: slave-bot1 + slave_password: XXXXXXXX + +The migration process assumes `dump` and `root` exist on the +`bootstrap_host` and have access from this host. + +The `dump` user will be used to dump data from `bootstrap_host`. The +`root` user will be used for localhost access after the database is +migrated. If `slave_user` and `slave_password` are set to non-empty +strings, replication will be setup against the `bootstrap_host` using +this user/password combination. + +Special /root/.my.cnf +--------------------- + +As a convenience, we copy the given `dump` and `root` user names and +passwords to /root/.my.cnf after migration. If this file is overwritten, +they will also be available as /root/metadata.my.cnf diff --git a/elements/mysql-migration/element-deps b/elements/mysql-migration/element-deps new file mode 100644 index 00000000..2800bb88 --- /dev/null +++ b/elements/mysql-migration/element-deps @@ -0,0 +1,3 @@ +mysql +os-config-applier +os-refresh-config diff --git a/elements/mysql-migration/os-config-applier/etc/mysql/migration_default b/elements/mysql-migration/os-config-applier/etc/mysql/migration_default new file mode 100644 index 00000000..ea575ceb --- /dev/null +++ b/elements/mysql-migration/os-config-applier/etc/mysql/migration_default @@ -0,0 +1,4 @@ +MIGRATION_HOST={{mysql-migration.bootstrap_host}} +MIGRATION_USER={{mysql-migration.slave_user}} +MIGRATION_PASSWORD={{mysql-migration.slave_password}} +MIGRATION_DUMP_USER={{mysql-migration.users.dump.username}} diff --git a/elements/mysql-migration/os-config-applier/root/metadata.my.cnf b/elements/mysql-migration/os-config-applier/root/metadata.my.cnf new file mode 100644 index 00000000..b0e70584 --- /dev/null +++ b/elements/mysql-migration/os-config-applier/root/metadata.my.cnf @@ -0,0 +1,10 @@ +{{#mysql-migration.users.root}} +[client] +user={{username}} +password={{password}} +{{/mysql-migration.users.root}} +{{#mysql-migration.users.dump}} +[mysqldump] +user={{username}} +password={{password}} +{{/mysql-migration.users.dump}} diff --git a/elements/mysql-migration/os-refresh-config/migration.d/10-bootstrap-mysql b/elements/mysql-migration/os-refresh-config/migration.d/10-bootstrap-mysql new file mode 100755 index 00000000..d8a6ca35 --- /dev/null +++ b/elements/mysql-migration/os-refresh-config/migration.d/10-bootstrap-mysql @@ -0,0 +1,76 @@ +#!/bin/bash +# +# Copyright 2013 Hewlett-Packard Development Company, L.P. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +set -eux + +# Quietly go away unless a migration has been asked for +DEFAULTS=/etc/mysql/migration_default +[ -e $DEFAULTS ] || exit 0 +source $DEFAULTS + +DONE_FILE=/etc/mysql/migration_done +if [ -e $DONE_FILE ] ; then + echo migration from [$MIGRATION_HOST] already completed. + ls -l $DONE_FILE + exit 0 +fi + +# MySQL may be stopped pre-configuration, so try to start it +if [ -d /etc/init ] ; then + # Upstart: During initial boot, mysql will start in parallel with os-refresh-config + # wait-for-state is a job that allows blocking until a particular state is reached. + start wait-for-state WAIT_FOR=mysql WAITER=$(basename $0) WAIT_FOREVER=Y TARGET_GOAL=start WAIT_STATE=running +else + service mysql start || : +fi + +local_mysql() { + if [ -e /root/.my.cnf ] ; then + mysql --defaults-extra-file=/root/.my.cnf "$@" + else + mysql "$@" + fi +} + +local_mysql -e 'SHOW GRANTS' +# This runs as root. We assume root has a .my.cnf or access +# via localhost. +if [ -n "$MIGRATION_HOST" ] ; then + local_mysql -e 'STOP SLAVE' || : + # If we are planning on setting up a full slave + if [ -n "$MIGRATION_USER" ] && [ -n "$MIGRATION_PASSWORD" ] ; then + local_mysql -e "CHANGE MASTER TO master_host='${MIGRATION_HOST}', master_user='${MIGRATION_USER}', master_password='${MIGRATION_PASSWORD}'" + fi + mysqldump --defaults-extra-file=/root/metadata.my.cnf \ + -u $MIGRATION_DUMP_USER + --single-transaction \ + --all-databases \ + --master-data \ + -h $MIGRATION_HOST | local_mysql + + # After this following command, our ~/.my.cnf may stop working as its + # password may change due to the dump loaded above. + local_mysql -e 'FLUSH PRIVILEGES' + + # Now that database has been loaded, use creds that should match + cp -f /root/metadata.my.cnf /root/.my.cnf + # Now get the slave going if creds were provided + if [ -n "$MIGRATION_USER" ] && [ -n "$MIGRATION_PASSWORD" ] ; then + local_mysql -e "START SLAVE" + fi + touch $DONE_FILE +fi