用Oracle导出导入数据,以前用exp和imp总是报字符集的错误。后来查了下,Oracle 10g新增了expdp(导出)和impdp(导入)两个工具,而它们会自动根据数据库的配置来设置导出文件的字符集,就是可以无视客户端的字符集设置了。但是有个缺点,导出文件只能放在服务器上。这个问题不大,只要设好目录及相关权限就可以了。

以下例子,假设把USER_A的数据库,复制成USER_B的数据库。

首先,看一下已定义好的目录。如果有需要就新增一个。新增前要授权用户拥有“create any directory”的权限。

-- 查看已定义的文件夹
select * from dba_directories;

-- 查看用户“USER_A”的权限
select * from dba_sys_privs where grantee='USER_A';

-- 授创建文件夹的权限
grant create any directory to USER_A;

-- 创建目录
create or replace directory NEW_DIR as '/tmp';

进行导入导出之前,要授权相关用于拥有读写文件夹的权限。USER_A要导出数据,那他应该有“写”文件夹的权限;USER_B要导入数据,他要有“读”文件夹的权限。嫌麻烦的话,可以同时赋予文件夹的读写权限。

-- 授权用户“USER_A”拥有文件夹“NEW_DIR”的读写权限
grant read,write on directory NEW_DIR to USER_A;

-- 授权用户“USER_A”只有文件夹“NEW_DIR”的写权限
grant write on directory NEW_DIR to USER_A;

-- 授权用户“USER_B”只有文件夹“NEW_DIR”的读权限
grant read on directory NEW_DIR to USER_B;

导出导入的相关参数,查一下就知道了,这里只是操作该用户的所有对象。其中impdp的参数中,remap_schema是把源用户转换成目标用户(格式是 源用户:目标用户),remap_tablespace是把源表空间转换为目标表空间(格式是 源表空间:目标表空间)。以下命令需要在服务器的命令窗口执行。

--导出备份文件,USER_A的数据库
expdp USER_A/PASSWORD@sid schemas=USER_A directory=NEW_DIR dumpfile=user_a_backup.dmp

--导入备份文件,把USER_A的数据库导入到USER_B的数据库
impdp USER_B/PASSWORD@sid remap_schema=USER_A:USER_B remap_tablespace=USER_A_TS:USER_B_TS directory=NEW_DIR dumpfile=user_a_backup.dmp

参考资料:

在“搬瓦工”上部署了“ownCloud 7”,记录一下相关的东西吧。采用“Debian 7 x86_64” + “Nginx”部署。

服务器安装

由于“ownCloud 7”的官方文档很齐全,所以基本按照教程就能顺利部署了。

1)在apt配置增加分发包安装地址,然后用apt安装。会提示相关依赖包,一并安装。命令如下:

sudo echo "deb http://download.opensuse.org/repositories/isv:/ownCloud:/community/Debian_7.0/ /" >> /etc/apt/sources.list.d/owncloud.list
apt-get update
apt-get install owncloud

apt的好处是,升级方便。

2)Nginx配置。这个我找了好久,原来官方文档就已经说明清楚了。

Nginx Configuration — ownCloud Administrators Manual 7.0 documentation
按照文档内容部署好,重启一下Nginx就可以了。由于StartSSL的证书申请失败,只能先放弃https。

3)初次配置。登录部署好的OwnCloud,按照提示操作即可。

客户端安装

我的移动设备就只有Android手机和平板了。虽然Android客户端是开源的,但是官方提供的下载地址是Google Play的收费版。由于不能付费购买,就只好自己编译。但我比较懒,幸好网上有提供编译好的版本。链接如下:
ownCloud Synchronization client - F-Droid

总结

部署个ownCloud也纯粹是玩玩而已。对于一个国外(速度慢)廉价(空间小)VPS来说,实用性还是不大。但是ownCloud支持Google Drive(15GB免费)、Dropbox(2GB免费)、FTP等扩展,其实用性大大提升!

前段时间把自己的小玩意迁移到GitHub,于是学了一下git。把相关的教程整理一下。

1)git - 简明指南
http://rogerdudler.github.io/git-guide/index.zh.html
这个教程应该是最简单明了,没有之一。几分钟就看完。还有多国语言版。

2)Learn Git Branching
http://pcottle.github.io/learnGitBranching/
在线学习并操作git命令。图形化界面,非常适合初学者。

3)Git教程 - 廖雪峰的官方网站
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
篇幅不长的教程,号称“史上最浅显易懂的Git教程”。教程中,作者把git相关的问题,该说的都说清楚了。

4)Pro Git中文版
https://www.progit.cn/
基本上关于Git的详细内容都在这本书了。如果看了上面的教程,仍有疑问,那么这本书应该都能解决。

现在最方便最便宜的存储,当属网盘了。于是想,是否可以利用来作为VPS的日常备份?Google了一下,很多教程。本来想用百度盘,毕竟2TB的免费空间肯定用不完。但是想想,还是用国外的吧,速度会更快。Google Drive的免费空间有15GB,而且已有了开源的同步工具,就选它了。

这个教程已经说得很详细了:VPS每日自动备份到Google Drive

按照教程去配置同步工具grive,修改了一下备份脚本,如下(主要是去掉了数据库文件的加密操作):

#### begin file autobackup.sh ##########################
#!/bin/bash
# from http://eamin.net/vps%E6%AF%8F%E6%97%A5%E8%87%AA%E5%8A%A8%E5%A4%87%E4%BB%BD%E5%88%B0google-drive/
# begin settings
# MySQL user
MYSQL_USER=ro
# MySQL password
MYSQL_PASS=123
# backup directory
BACKUPDIR=/opt/backup
# grive directory
GDRIVEDIR=/opt/grive/
# website directory
WEB_DATA=/opt/www/
# the password file for encrypting the database backup files
#PASSWDFILE=/home/passwd
# end settings

# naming rule of backup files
DataBakName=mysql_$(date +"%Y%m%d").tar.gz
WebBakName=www_$(date +%Y%m%d).tar.gz
# delete files three weeks ago
OldData=mysql_$(date -d -21day +"%Y%m%d").tar.gz
OldWeb=www_$(date -d -21day +"%Y%m%d").tar.gz

# Create the directory when not existed
if [ ! -d $BACKUPDIR ]; then
    mkdir -p $BACKUPDIR
fi

cd $BACKUPDIR

# begin backup database
DATABASES=`mysql -h "127.0.0.1" -u $MYSQL_USER -p$MYSQL_PASS -Bse 'show databases'`

for DB in $DATABASES; do

# ignore system tables
if [ "$DB" == "information_schema" -o "$DB" == "performance_schema" -o "$DB" == "mysql" ]; then
    continue
fi

# export data to backup file
SQLFILE="$BACKUPDIR/$DB.sql.gz"
#ENCFILE="$BACKUPDIR/$DB.sql.gz.enc"
mysqldump -h "127.0.0.1" -u $MYSQL_USER -p$MYSQL_PASS $DB | gzip -9 > $SQLFILE

# encrypt database backup file
#openssl des3 -in $SQLFILE -out $ENCFILE -pass file:$PASSWDFILE
# decrypt database backup file
#openssl des3 -d -in $ENCFILE -out $SQLFILE -pass file:$PASSWDFILE

# delete the file without encryption
#rm $SQLFILE
done
# end backup database

# compress and merge all the backup files
#tar zcf $BACKUPDIR/$DataBakName $BACKUPDIR/*.sql.gz.enc
#rm $BACKUPDIR/*.sql.gz.enc
tar zcf $BACKUPDIR/$DataBakName $BACKUPDIR/*.sql.gz
rm $BACKUPDIR/*.sql.gz

# backup website files
tar zcpf $BACKUPDIR/$WebBakName $WEB_DATA

cd $GDRIVEDIR
grive
rm $OldData
rm $OldWeb

# move the files to grive directory
mv $BACKUPDIR/$WebBakName $GDRIVEDIR/bwg01_backup
mv $BACKUPDIR/$DataBakName $GDRIVEDIR/bwg01_backup
grive

#### end file autobackup.sh ##########################

Volley是Google于2013年推出的Android网络数据传输框架。用起来非常简单。但是字符编码的问题让人头痛。Volley默认获取Response Headers中Content-Type来转换字符编码。若该值获取不到,则默认ISO-8859-1。问题就在于很多网站都没有设置该值。只能自己改为默认UTF-8。

把收集到的相关资料记录一下:
1)Transmitting Network Data Using Volley

2)Android Volley完全解析

豆丁买了蔓越莓干,提议烤蔓越莓曲奇。第一次烤糊了,饼干很脆,蔓越莓干变得很硬。第二次调低温度,算是成功了。整理一下材料和步骤。

原文见:http://blog.sina.cn/dpool/blog/s/blog_4a5089ff0100avgm.html

材料

  • 黄油 75克
  • 鸡蛋液(打散的全蛋) 15毫升
  • 低筋面粉 115克
  • 糖粉 60克(我改为45克,看糖粉的甜度和个人口味来定吧)
  • 蔓越莓干 35克(份量越多,就会越酸)

步骤

  1. 黄油软化后,加入糖粉,搅拌均匀。不需要打发。
  2. 加入蛋液,搅拌均匀。
  3. 加入过筛的低筋面粉,搅拌均匀。
  4. 加入切碎后的蔓越莓干,搅拌均匀。
  5. 用手把面团整形成宽约6CM,高约4CM的长方体。放入冰箱冷冻(不是冷藏)1小时左右。建议用保鲜纸包住。
  6. 冻硬的长方形面团用刀切成厚约0.7CM的片。切好后放入烤盘。
  7. 烤箱150度预热10分钟,然后上下火140度烤18分钟左右。我的是长帝烤箱,温度偏高,所以比原教程的温度低。烤至表面金黄即可。

戚风蛋糕是“Chiffon Cake”的音译。Chiffon是“雪纺绸”的意思。制作时注意,蛋白的打发,正确的搅拌对戚风的成功至关重要。糖的份量可以根据个人口味调节(本配方偏淡)。

材料

  • 鸡蛋,5个
  • 低筋面粉,85g
  • 无味蔬菜油,40g
  • 鲜牛奶,40g
  • 细砂糖(加入蛋白中),45g
  • 细砂糖(加入蛋黄中),25g

烘焙

150度,约50分钟。需根据实际情况调整问题及时间。例如调低温度,延长烘培时间,可以防止烤焦。

制作步骤

1、用打蛋器把蛋白打到呈鱼眼泡状的时候,加入1/3的细砂糖,继续搅打到蛋白开始变浓稠,呈较粗泡沫时,加入1/3糖。再继续搅打,到蛋白比较浓稠,表面出现纹路的时候,加入剩下的1/3糖。(如果一次加入糖过多,会妨碍蛋白的起泡,所以打蛋白的时候,一般习惯使用分次加糖的方式。)

2、再继续打一会儿,当提起打蛋器,蛋白能拉出弯曲的尖角的时候,表示已经到了湿性发泡的程度。如果是做戚风蛋糕卷,蛋白打发到这个程度就可以了。但如果制作常规的戚风蛋糕,就还需要继续搅打。当提起打蛋器的时候,蛋白能拉出一个短小直立的尖角,就表明达到了干性发泡的状态,可以停止搅打了。打到干性发泡以后,就不要继续搅打了,如果搅打过头,蛋白开始呈块状,会造成戚风制作的失败。

3、5个蛋黄加入25克细砂糖,用打蛋器轻轻打散。不要把蛋黄打发。

4、依次加入40克色拉油和40克牛奶,搅拌均匀。再加入过筛后的面粉,用橡皮刮刀轻轻翻拌均匀。不要过度搅拌,以免面粉起筋(面粉如果起筋,可能会使蛋糕的口感过韧,影响蛋糕口感的松软)。

5、盛1/3蛋白到蛋黄糊中。用橡皮刮刀轻轻翻拌均匀(从底部往上翻拌,不要划圈搅拌,以免蛋白消泡)。翻拌均匀后,把蛋黄糊全部倒入盛蛋白的盆中,用同样的手法翻拌均匀,直到蛋白和蛋黄糊充分混合。混合好后的状态应该是比较浓稠均匀的浅黄色。

6、将混合好的蛋糕糊倒入模具,抹平,用手端住模具在桌上用力震两下,把内部的大气泡震出来。放进预热好的烤箱,150度,约50分钟即可。烤好后的蛋糕从烤箱里取出来,立即倒扣在冷却架上直到冷却。然后,脱模,切块即可享用。

使用“搬瓦工”的vps已经接近半年了。期间升级过配置,拥有128m内存“大内存”(真是泪流满面)和2GB硬盘空间。于是把blog和自己的网站都丢上去,抛弃那个又慢又小的虚拟空间。把过程中的问题都记录一下。

域名

第一次绑定域名和IP,走了点弯路。一开始不知道域名提供商不提供DNS服务,要自己找一个。
1)申请DNSPod,国内的免费DNS服务。添加域名,然后针对该域名添加两条A类型的记录,主机分别是“@”和“www”。
2)设置域名的DNS服务器地址为DNSPod的地址:
f1g1ns1.dnspod.net
f1g1ns2.dnspod.net
3)剩下就只有等待了。不过不用等多久就开通了。

Nginx

主要是PHP相关的设置:

location ~ \.php(\/.+)?$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass unix:/var/run/php5-fpm.sock; #用SOCK比较快
    fastcgi_index index.php;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    include fastcgi_params;
    fastcgi_buffers 8 16k; #避免跳转报502错误
    fastcgi_buffer_size 32k; #避免跳转报502错误
}

后面还要设置HTTPS,用于部署OwnCloud。

PHP和PHP-FPM

这里基本用的是默认配置,后面再考虑优化。

MySQL

前面已经配好了,而且是针对小内存的机器来优化的。

VIM

增加支持显示中文字符。修改 /etc/vim/vimrc 文件,字啊末尾增加如下代码:

set fileencodings=utf-8,gb2312,gbk,gb18030
set termencoding=utf-8
set fileformats=unix
set encoding=prc

Wordpress迁移Typecho

主要是Wordpress太臃肿了,对于一个几乎只有自己看的Blog来说,不需要那么多东西。于是直接部署Typecho。利用相关的插件,导入Wordpress的数据即可。

大概就这样完成了迁移。后面的计划是部署OwnCloud,用来同步一些小文件。对了部署个私有SVN或者GIT服务器也是不错的。然后就是Laravel框架的学习了。

在128MB内存的VPS上折腾了一下MySQL,把过程总结一下记录下来。

1)配置文件

备份原配置文件,把官方配置样例中最低配置的配置文件复制过来,就可以了。命令如下:

mv /etc/mysql/my.cnf /etc/mysql/my.cnf.bak
cp /usr/share/doc/mysql-server-5.5/examples/my-small.cnf /etc/mysql/my.cnf

2)禁用InnoDB

禁用InnoDB,为了节省内存。

详细参考:小内存VPS上MySQL5.5内存优化——禁用Innodb引擎

简单来说,就是修改my.cnf,在[mysqld]下增加以下配置:

default-storage-engine = MyISAM
loose-skip-innodb
innodb=OFF

文中还提到MySQL 5.5,还需要添加以下配置,否则程序会很容易退出的:

loose-innodb-trx = 0
loose-innodb-locks = 0
loose-innodb-lock-waits = 0
loose-innodb-cmp = 0
loose-innodb-cmp-per-index = 0
loose-innodb-cmp-per-index-reset = 0
loose-innodb-cmp-reset = 0
loose-innodb-cmpmem = 0
loose-innodb-cmpmem-reset = 0
loose-innodb-buffer-page = 0
loose-innodb-buffer-page-lru = 0
loose-innodb-buffer-pool-stats = 0

3)设置默认字符集UTF-8

登录MySQL后,用以下命令查看字符集设置:

show variables like ‘character%’;

默认字符集一般是latin1,最简单是修改my.cnf文件

[client]增加:

default-character-set = utf8

[mysqld]增加:

character-set-server = utf8

[mysql]增加:

default-character-set = utf8

4)重启MySQL服务

PS. MySQL的错误日志在/var/lib/mysql/*.err

使用“搬瓦工”的超级便宜VPS已经快3个月了,除了有时晚饭时间比较卡以外,其它方面都工作良好。于是心里开始发痒,想再利用它做更多的事情。

首先,肯定是升级Micro中最高性能的服务,128MB内存版。用过64MB版后,才深深感受到内存的重要性,而“搬瓦工”的空间就是内存比较少。升级过程很简单,用PayPal花费足够的美刀就OK了。付款后立刻看到效果!第一次感受到128MB原来也可以很爽(记得第一台电脑的内存也有256MB啊)。

然后是重装Shadowsocks服务。就为了以后升级方便,因为一开始是用源码编译安装的。关于Shadowsocks服务,真心推荐shadowsocks-libev,用C写的就是效率高、省内存,小内存主机必备。详细安装教程见:http://shadowsocks.org/en/download/servers.html

简单来说就是加入安装源,再用apt-get install安装。

wget -O- http://shadowsocks.org/debian/1D27208A.gpg | sudo apt-key add -
echo "deb http://shadowsocks.org/debian wheezy main" >> /etc/apt/sources.list
apt-get update
apt-get install shadowsocks

再然后是想学下Laravel这个PHP框架(感觉没CodeIgniter那么容易上手),慢慢来吧。

PS.昨天一个网友说也买了个“搬瓦工”的VPS,但是3个月后开始变得好慢。虽然有点担心,但是起码还有三个月可以玩玩,重点是就算不能用,损失也不会很严重(毕竟我的那个才5.99美刀/年)