使用WP-CLI在本地导入远程数据库的最快方法(最少的步骤)


13

我想自动化使用WP-CLI导入远程数据库的任务。

当前过程是到ssh服务器,然后export使用WP-CLI运行to文件,通过scp或将文件复制到本地目录rsync,然后import通过WP-CLI将文件复制到本地目录。我想在这里利用@alias和删除尽可能多的步骤。

虽然我想这样的事情是可能的:

echo "$(wp @remote db export -)" | wp @local db import -

在未压缩的数据库大小> 5GB的情况下,这似乎是一个更可行的选择:

DB_EXPORT=$(echo "$(wp @remote db export -)" | gzip | base64 -w0); echo "$DB_EXPORT" | base64 -d | gunzip | wp @local db import -

不幸的是,我可能会达到终端的极限,或者应该清理此调用的结构,因为我的窗口似乎挂了。

我可以scp从此过程中删除其他解决方案吗?我在这里还可以使用其他命令吗?我已从此处的示例中删除了多站点,但这也是要考虑的一部分,它可能是别名的一部分。

理想情况下,我希望将来有这样的事情:

wp @local db import @remote


@aliasBasic Vagrant box一起使用的当前示例设置。

~/.wp-cli/config.yml

@basic:
    ssh: basic.dev/var/www/wordpress/

~/.ssh/config

Host basic.dev
    HostName basic.dev
    User vagrant
    IdentityFile ~/sites/basic.dev/.vagrant/machines/default/virtualbox/private_key

更新

基于@davemac,看起来此过程可以轻松简化为

wp db import - <<< $(wp db export -);

现在我只需要考虑MU-Site的表和site_url

wp @basic db export --tables=$(wp @basic db tables --url=http://basic.dev/site/ --format=csv) - | gzip > basic-dev-site.sql.gz

blog_id=$(wp @basic eval --url=http://basic.dev/site/ 'echo get_current_blog_id();');

prefix=$(wp @basic eval --url=http://basic.dev/site/ 'global $wpdb; echo $wpdb->prefix;')

site_url=$(wp @basic eval "echo site_url();")

使用search-replace-谢谢@WestonRuter

sql=$(wp search-replace $(wp eval "echo site_url();" | cut -d ":" -f2) "//new-site.com" --network --skip-columns=guid --export); printf "%s" "$sql"

WP多站点-将远程站点导出到本地导入而无需文件:

wp @remote db export --tables=$remote_tables - | sed "s#$remote_prefix#$local_prefix#g" | sed "s#$remote_site_domain#$local_site_domain#g" | wp @local db import -


类似的


您可以编写一个bash脚本,该脚本通过cron作业调用以将scp / rsync文件传输到远程服务器。然后,在远程服务器上,您可能会有另一个bash脚本,该脚本通过cron作业运行,该脚本监视文件夹中的备份文件,并且一旦该文件存在,它将导入到远程数据库中。这类似于我保持“热备用”服务器同步的方式。
黄铜

就我个人而言,我不希望在Cron工作中执行此操作,因为它给混合添加了另一个依赖关系,而更多的是仅当我在工作时尝试使本地与远程同步。“远程”是许多别名之一-与本地相同。减少函数调用的另一个原因是因为我倾向于单行/复制/粘贴/执行!代码行;)
jgraup16年

您是否尝试将转储写入临时文件而不是变量?
大卫,

这就是您现在需要做的,这需要WP-CLI之外的功能来处理文件传输---以及每个位置的更多身份验证。
jgraup

@jgraup这个问题解决了吗?
伊桑·金克斯·奥沙利文

Answers:


6

WP-CLI 0.24.0开始,您现在可以使用别名,这使您可以轻松导入远程数据库。

通过使用别名,您可以对另一个WP-CLI安装运行WP-CLI命令。该安装可能是远程计算机。

考虑到这一点,我破解了一个bash别名,该别名将几个WP-CLI命令链接在一起,以将远程WP数据库拉入本地站点。在这种情况下,我有一个本地wp-cli.yml文件,其中将@prod设置为生产站点的别名(使用SSH别名)。

pullprod() {
    # make a backup of the current local database
    wp db export _db.sql
    wp db reset --yes
    # get current directory name, used for database and URL
    current=${PWD##*/}
    # connect to remote site and ssh the remote database down to our local directory
    wp @prod db export - > $current.sql
    echo "copying of remote database to $current directory complete."
    wp db import
    # database is now imported so we can delete it
    rm -rf $current.sql
    # get the remote site URL, remove the http:// for our search replace
    production_url=$(wp @prod eval '$full_url=get_site_url();$trimmed_url=str_replace("http://", "", $full_url); echo $trimmed_url;')
    wp search-replace "$production_url" "$current.localhost"
    echo "All done, enjoy!"
}

一个pullprod在目前的WP现场指挥会做你需要什么,以及你有设置别名(可以自动为好)。

它可以工作,但是我的下一个任务是改善如何获取$ production_url变量,因为目前我正在从本地文件中提取它。


这很棒。老实说我真的是在寻找wp @alias db export - > $localfilename.sql。对于MU-Site来说,它变得有些复杂,但是如果您想要一个产品URL,请尝试production_url=$(wp @prod eval "echo site_url();"); echo "The URL is $production_url";
jgraup

到底是wp db reset --yes做什么的?啊...清除所有表,以便新文件具有干净的数据库。DB重置
jgraup

1
为此,我采用了您的产品URL技术,并对其进行了一些修改,以从生产URL中删除http://(因为这样可以进行更全面的搜索和替换)
davemac

1
另请注意,wp search-replace它还支持--exportarg,因此您可以一次导出和搜索/替换所有内容:wp-cli.org/commands/search-replace
Weston Ruter
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.