Posts Tagged ‘mysql’

setup rails edge on Windows XP

Wednesday, February 25th, 2009

帮朋友在 Windows XP 上搭建 rails 开发环境, 想想已经两年没正经用 windows, 不过这次一路搞下来还比较顺利. 简单记录一下步骤:

首先去 rubyforge.org 上下载 all-in-one ruby installer, 安装以后已经默认加好了路径, c:\ruby -v 应该可以看到. 这次我还是装了 1.8.6, 不过看 1.8.7 已经到了 rc2, 不远了.

第二步升级 gem update –system, 把 gem 本身升级一下.

接下来 gem install rails –include-dependencies 安装 rails, 其实如果用 edge 的话也可以不安装.

然后 gem install mongrel, 用来做本地服务器

装 Netbeans 6.5 做 IDE, 现在注册下载后推荐三个朋友也下载可以得到一个 2G U盘, 我照着做了, 看什么时候能收到 XD

最后装 Mysql, 开始装了 5.1 作为 Windows 服务, 但是启动 rails app 的时候连接 mysql 失败, 发现 rails 2.3 中去掉了 mysql.rb 这个默认驱动, 必须自己安装.

gem install mysql 报错说文档生成的时候有问题, 卸掉重装 gem install mysql –no-ri –no-rdoc, 可以绕过错误

后来又发现莫名奇妙的错误, 解决方法是把 mysql 现在的一个 dll 拷贝到 ruby\bin 下面, 后来又出现 Mysql 服务不能启动的问题, 最后换了 Mysql 5.0, 用 mysqld-nt 手动添加服务搞定.

最后还要装 Git, windows 上面有个 msysGit 可以用, 不过感觉巨慢, 不知道是 windows 上的性能不好, 还是朋友的机器太肉. 通过 git bash 直接导出项目会发现所有的文件都是 modified, 不用说肯定是文件结束符的问题, 之前就发现过但是没找到解决办法, 当时还被迫把项目转回了 svn, 这次发现 github.com 已经有解决方案了: deal with newlines in git.

这下完事大吉了.

脱离Rails使用ActiveRecord在多个数据库之间做数据迁移

Thursday, February 7th, 2008

ActiveRecord 是好东西,可以简化很多代码,在 Rails 之外做数据维护时也是超级好用。今天需要在两个数据库之间做下数据迁移,因为 schema 有变,所以 mysqldump 基本没什么用。

先是发现了一个 ar_fixture 的插件,使用方法极度简单,但是出现了 UTF-8 不支持的问题,我数据库里使用中文的字段竟然按照 binary 处理,不理解。

最终找到一篇文章很靠谱,实验一下,问题搞定。

先写一个数据库配置文件 database.yml

db1:
adapter: mysql
host: localhost
username: root
password:
database: database1
db2:
adapter: mysql
host: mysql
username: root
password:
database: database2

然后写一个 imgration.rb

require ‘rubygems’
require ‘active_record’
require ‘yaml’

$config = YAML.load_file(File.join(File.dirname(__FILE__), ‘database.yml’))

class Database1 < ActiveRecord::Base
establish_connection $config['db1']
end

class Database2 < ActiveRecord::Base
establish_connection $config['db2']
end

module A
class Tb1 < Database1
set_table_name 'tablename1'
end
end

module B
class Tb2 < Database2
set_table_name 'tablename2'
end
end
... your task process ..

把两个数据库分别写在两个 module 里面,好处是可以避免命名空间冲突, 坏处是代码多了一点,调用时应该:

tb1 = A::Tb1.find :all
tb2 = B::Tb2.find :all

MySQL encoding and converting databases to UTF8

Wednesday, May 16th, 2007

1.) Dump the DB:
mysqldump –user=username –password=password –default-character-set=latin1 –skip-set-charset dbname > dump.sql

2.) Replace all latin1 instances with utf8:
sed -r ’s/latin1/utf8/g’ dump.sql > dump_utf.sql

3.) Delete the old DB, create a new one in UTF8:
mysql –user=username –password=password –execute=”DROP DATABASE dbname; CREATE DATABASE dbname CHARACTER SET utf8 COLLATE utf8_general_ci;”

4.) Load the dump into the new DB:
mysql –user=username –password=password –default-character-set=utf8 dbname < dump_utf.sql

original link 

I love MySQL and the company

Monday, April 9th, 2007

I read from mysql official docs:

MySQL’s core value:

  • To be the best and the most widely used database in the world
  • To be available and affordable by all
  • To be easy to use
  • To be continuously improved while remaining fast and safe
  • To be fun to use and improve
  • To be free from bugs

MySQL AB’s core value:

  • We subscribe to the Open Source philosophy and support the Open Source community
  • We aim to be good citizens
  • We prefer partners that share our values and mindset
  • We answer email and provide support
  • We are a virtual company, networking with others
  • We work against software patents

rails中的session存储问题

Thursday, March 29th, 2007

Add-ons 的功能基本开发完成,已经进入 beta 测试阶段,之前 session 一直用 FileStore 存储,部署到 production server 之后这样似乎不太靠谱,于是转用 ActiveRecordStore ,这样一方面提高效率,之前的 session 全部以文件形式存储查找慢,用数据建立索引可以加速。另一方面多 server 做 load balance 之后每次请求都可能会在不同的 server 上跳,会出现找不到 session 的情况。这样全部使用统一的 DB 做存储,各个请求之间不共享任何东西,我们也就不用在 web 层和应用层维护任何状态,状态的维护工作被我们放在了一个特定的整合点上,这个叫无共享架构(share-nothing architecture)

Yahoo 这样用 PHP,LiveJournal 这样用 Perl,我们这样用 ROR~ 上面提到的整合点最简单的应该是 ActiveRecordStore,此外还可以用DRbMemcached

使用 ActiveRecordStore 存储 session 第一步建一张存 session 的表,如果你用了 migration,直接rake db:sessions:create 就可以了,自己见表的话用以下 sql

create table sessions (
id int(11) not null auto_increment,
sessid varchar(255),
data text,
updated_at datetime default null,
primary key(id),
index session_index (sessid)
);

然后编辑 config/environment.rb 或者 config/environments/production.rb:

config.action_controller.session_store = :active_record_store

一共两步,搞定 ^-^ 重启 server,访问一下,查查数据库,有了!(Whisper 说 mysql 有内存表,会更快)

删除以前的那些文件 session,这个东西可以删除12小时前的session:

find tmp/sessions -name ‘ruby_sess*’ -ctime +12h -delete

数据库 session 表的删法还要在研究一下 TOT

[Update] 定时删除 session 有一个扩展 ActiveRecord::Session 的方法我没搞出来,后来干脆直接在 crontab 里加了一个任务,执行删除 session 的一个脚本

#!/bin/sh
mysql database_name -uuser_name -ppassword << eof
delete from sessions where date_sub(now(), interval 6 hour) > updated_at and bit_length(data) <= 688;
eof

exit 0;

Reference:
cron, man cron, man 5 crontab
Agile web development with Rails
Rails Wiki

Rail处理Unicode问题

Monday, November 27th, 2006

中国人写应用似乎第一个要处理的重大问题总是Unicode,中文的双字节和英文的单字节差异带来的麻烦真实浪费了我们不少时间。

Rails应用处理Unicode可以参考石锅拌饭的一篇文章和他也参考过的一篇文章

在我处理的过程中一直遇到一个collation冲突的问题,原来是我用了CocoaMySQL的前段工具操作DB,里面有一栏写着Encoding:UTF8,我信以为真,结果mysqldump导出sql文件一看,我的所有表还是latin1,无语,手工改了一下sql再导回去,一切OK

同样是处理中文,Rails感觉比Java的东东方便很多…不过还有一个问题没有解决,OSX下面安装的MySQL配置文件在哪?一直没有找到,官方的中文5.1文档上也没见影子。