2009年1月26日星期一

第一个PowerShell脚本:备份Drupal站点

今天完成了第一个Windows PowerShell脚本,比较开心。这个脚本的功能是:
  • 备份Drupal sites目录并压缩
  • 备份Drupal数据库并压缩
在运行脚本之前,要创建一个用于存放备份文件的目录,如SiteBackup,然后分别创建DB和Site目录分别用于存放数据库的Drupal程序文件。
脚本source code如下:

# Usage:
# backup_drupal_db.ps1

Write-Host "This script will backup&zip the drupal database and zip it."

$site_name = "rzchina"
$db_name = "rzchina"
$drupal_site_dir = "C:\XAMPP\xampplite\htdocs\rzchina\sites"

$target_db_dir = "C:\Users\example.net\Site-Backup\DB"
$target_drupal_dir = "C:\Users\example.net\Site-Backup\Site"

$mysql_bin_dir = "C:\XAMPP\xampplite\mysql\bin"
$7zip_bin_dir = "C:\Program Files\7-Zip"

$curr_dir = Get-Location
$curr_date = date -format "yyyyMMdd-Hmss"

# Backup database
$target_db_filename = $target_db_dir + "\" + $db_name.ToString() + "_" +

$curr_date.ToString()


$sql_filename = $target_db_filename + ".sql"

Write-Host "Start backup db..."

cd $mysql_bin_dir

./mysqldump -uroot -c -e --default-character-set=gbk --skip-set-charset --hex-blob $db_name > tmp_sql
get-content tmp_sql | set-content -encoding utf8 $sql_filename

Write-Host "DB backup ended."

# Zip db file
Write-Host "Start zipping...";

cd $7zip_bin_dir

$zip_filename = $target_db_filename + ".7z"

./7z.exe a $zip_filename $sql_filename

# Clean up
Write-Host "Clean up..."
del $sql_filename;

# Zip Drupal Site File
$zip_site_filename = $target_drupal_dir + "\" + $site_name + $curr_date.ToString() + ".7z";
./7z.exe a $zip_site_filename $drupal_site_dir

Write-Host "The End."

cd $curr_dir
由于是第一个脚本,因此略显幼稚,不过任务还完成的不错。接下来研究如何传递参数,实现更通用的脚本。

7 条评论:

  1. 非常奇怪,我使用mysqldump备份的数据库,竟不能restore,总是提示字符错误。但打开导出的sql文件,里面的文字还都是正常的。有待进一步探索。我想可以先创建一个小数据库,然后通过mysqldump进行导出,并用mysql进行导入,如果正确,则可以说明一些问题。我怀疑是由于默认文件编码的问题。

    回复删除
  2. 研究发现,应该在mysqldump时,设置-default-character-set=gbk,以及--hex-blob,才能导出有效的sql脚本。
    然后,导出的脚本通过mysql中的source可以restore数据库,通过phpmyadmin是不行的。

    回复删除
  3. 但导入成功后,通过phpmyadmin查看数据时,中文全都变成了乱码。

    回复删除
  4. 我怀疑是在mysql中,应设置character set为utf-8

    回复删除
  5. 将导出的sql脚本中:
    -- MySQL dump 10.11
    --
    -- Host: localhost Database: rzchina
    -- ------------------------------------------------------
    -- Server version 5.0.67-community

    /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
    /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
    /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
    /*!40101 SET NAMES utf8 */;

    将set names gbk 改为 set names utf8,就可以通过phpmyadmin正确导入了。

    回复删除
  6. 成功!

    在导出sql时,skip SET NAMES,即可。

    回复删除
  7. 在get-content后通过set-content为其它编码的文件时,不能使用相同的文件名。 如 get-content $filename | set-content -encoding utf8 $filename是不行的。

    回复删除