Banco de dados do WordPress sob controle de versão

Fiz um scriptzinho maroto pra manejar o dump de um banco de dados do WordPress. Ele serve pra exportar os dados do banco para um arquivo texto, substituindo a URL do site por uma string mágica; e também pra importar os dados do arquivo texto para o banco, desfazendo a substituição da URL. Assim, a gente consegue manter os dados do servidor de homologação/produção sob controle de versão, exportando estes dados para o arquivo texto sempre que há modificações no servidor, e importando os dados nas máquinas de desenvolvimento, mantendo o conteúdo do servidor replicado na máquina do desenvolvedor. Deu pra entender? Espero que não.
;-)

dodump.sh

#!/bin/bash

function showerror {
    echo -n "ERROR: "
    echo $*
    usage
    exit 1
}

function usage {
    echo "USAGE: dodump.sh [dump|load] [[-c path/to/wp-config.php] [-f path/to/dumpfile.sql] [-u your.domain.com]]"
}

if [ $# -eq 0 ]; then
    usage
else

    SITEURL="none"
    DOMAIN="none"
    ACTION="nothing"
    DUMPFILE="dumpfile.sql"
    WP_CONFIG="default"
    while [ "$1" != "" ]; do
        case $1 in
            dump | --dump )
                ACTION="dump"
                ;;
            load | --load )
                ACTION="load"
                ;;
            -c | --config )
                shift
                WP_CONFIG=$1
                ;;
            -f | --file )
                shift
                DUMPFILE=$1
                ;;
            -u | --url )
                shift
                DOMAIN=$1
                ;;
            -h | --help | --? | /? )
                usage
                exit
                ;;
            * )
                usage
                exit 1
        esac
        shift
    done

    DB_NAME='notfound'
    DB_USER='notfound'
    DB_PASSWORD='notfound'
    DB_HOST='notfound'

    if [ "$WP_CONFIG" == "default" ]; then
      WP_CONFIG='wp-config.php'
      if [ ! -f $WP_CONFIG ]; then WP_CONFIG='www/wp-config.php'; fi
    fi

    if [ -n "$WP_CONFIG" ]; then
        if [ -f $WP_CONFIG ]; then
          DB_NAME=`cat ${WP_CONFIG} | grep "define" | grep "DB_NAME" | sed "s/define\s*(\s*'DB_NAME'\s*,\s*'\([^']*\)'\s*)\s*;\r\?/\1/g"`
          DB_USER=`cat ${WP_CONFIG} | grep "define" | grep "DB_USER" | sed "s/define\s*(\s*'DB_USER'\s*,\s*'\([^']*\)'\s*)\s*;\r\?/\1/g"`
          DB_PASSWORD=`cat ${WP_CONFIG} | grep "define" | grep "DB_PASSWORD" | sed "s/define\s*(\s*'DB_PASSWORD'\s*,\s*'\([^']*\)'\s*)\s*;\r\?/\1/g"`
          DB_HOST=`cat ${WP_CONFIG} | grep "define" | grep "DB_HOST" | sed "s/define\s*(\s*'DB_HOST'\s*,\s*'\([^']*\)'\s*)\s*;\r\?/\1/g"`
        else
          showerror "Config file \"${WP_CONFIG}\" not found."
        fi
    else
        showerror "Config file not specified."
    fi

    CONNDATA="-h ${DB_HOST} -u ${DB_USER} -p${DB_PASSWORD} ${DB_NAME}"

    if [ "$DOMAIN" == "" ]; then
        showerror "Domain not specified."
    elif [ "$DOMAIN" == "none" ]; then
        SITEURL=`mysql ${CONNDATA} -e "SELECT option_value FROM wp_options WHERE option_name='siteurl'" --skip-column-names --batch | sed "s/\\\\./\\\\\\\\\\\\./g"`

        DOMAIN=`echo ${SITEURL} | sed "s/https\?:\\\\/\\\\/\(.*\)/\1/g"`
        DOMAIN=`echo ${DOMAIN} | sed "s/\\\\//\\\\\\\\\\\\//g"`
        SITEURL=`echo ${SITEURL} | sed "s/\\\\//\\\\\\\\\\\\//g"`
    else
        SITEURL="http://${DOMAIN}"
    fi

    if [ "$SITEURL" == "none" ]; then showerror "Could not retrieve your site URL from database, and [domain] was not specified."; fi

    if [ "$ACTION" == "nothing" ]; then
        showerror "Action not specified."
    elif [ "$ACTION" == "dump" ]; then
        echo -n "Dumping... "
        mysqldump ${CONNDATA} | sed "s/${SITEURL}/[[INSERT-SITEURL-HERE]]/g" | sed "s/${DOMAIN}/[[INSERT-DOMAIN-HERE]]/g" > ${DUMPFILE}
        echo "done!"
        echo "Dump written to file \"${DUMPFILE}\"."
    elif [ "$ACTION" == "load" ]; then
        if [ ! -f $DUMPFILE ]; then
          showerror "Dump file \"${DUMPFILE}\" not found."
        else
          read -n1 -p "Ok to PERMANENTLY overwrite your database information with \"${DUMPFILE}\" file contents? (y/N) "
          case "$REPLY" in
            "y" | "Y" )
              echo
              echo -n "Loading... "
              cat ${DUMPFILE} | sed "s/\[\[INSERT-DOMAIN-HERE\]\]/${DOMAIN}/g" | sed "s/\[\[INSERT-SITEURL-HERE\]\]/${SITEURL}/g" | mysql ${CONNDATA}
              echo "done!"
              echo "Dump loaded from file \"${DUMPFILE}\"."
              ;;
            "n" | "N" | "" )
              if [ "$REPLY" != "" ]; then echo; fi
              echo "Aborted."
              ;;
            * )
              echo
              echo "What part of the question did you not understand?! Aborted."
              ;;
          esac
        fi
    fi
fi


Baixe o arquivo dodump.sh (zip)
© Compostela: “Deixe o que puder; leve o que precisar.”

, , , , , , ,

  1. #1 by ldmotta on 02/07/2010 - 9:45 pm

    Mas bah chê!!!! Que barbaridade!!! não é que funcionou mesmo :D

    Valeu!

  2. #2 by Michael Granados on 22/03/2011 - 10:27 pm

    Caramba!

    O legal é que eu fiz uma solução também, mas em PHP usando o serialize/unserialize para alterar os dados do banco quando ele encontrar a URL no meio do projeto. Decidi fazer em PHP porque assim Alice Andrade (que usa windows) pode fazer o import e export usando o browser ;D

    Qualquer dia desses eu coloco num github da vida e te aviso pra você dar uma olhada.

    Ótima solução… Abraços!

    • #3 by Ederson Peka on 23/03/2011 - 12:08 am

      Pode crer, publica por aê. ;-)

      Eu já nem uso mais este script (não roda na porcaria do Mac e a galera aqui enche o saco, teria que alterar, sabe como é). Tô juntando umas gambis medonhas pra fazer um bem bolado diferente, mais “amigável” também, assim que der tempo eu publico.

      Abraço.

  1. Banco de dados do WordPress sob controle de versão: agora script em PHP! « Ederson Peka

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Sair / Alterar )

Imagem do Twitter

You are commenting using your Twitter account. Sair / Alterar )

Foto do Facebook

You are commenting using your Facebook account. Sair / Alterar )

Connecting to %s

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

Join 257 other followers