搜尋此網誌

2011年11月9日 星期三

如何快速的移轉sql server 2008 資料到新的主機上

最近因為來了台新server 主機需要把原本的sql server 2008 上的資料
移轉到新主機上,因為database 有20多個,如果一個一個用 restore 的方式
還要一個一個建立database 再 restore 有些麻煩
於是決定使用直接copy .mdf .ldf 資料庫檔案的方式來移轉
但因為資料庫檔案也是分散在不同disk 上,用手動copy 又怕有漏掉的
網路上查了一下找到一個可以查出資料庫檔案的路徑及檔名的sql 指令
 SELECT   physical_name from FROM sys.master_files
我再修改一下這個sql ,將結果存成一個 old2new.bat 檔
SELECT  'copy "'+ physical_name + '" "\\192.168.0.100\e$\db files"' AS current_file_location
FROM sys.master_files  s order by physical_name



old2new.bat 的內容
copy "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\DB_COLLECT.mdf" "\\192.168.0.100\e$\db files"
copy "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\DB_COLLECT_log.ldf" "\\192.168.0.100\e$\db files"

....
在原主機上執行 old2new.bat
把檔案copy 到新主機(sql sevrer 的服務要先停掉)

再使用下列sql ,將結果存成 new2path.bat,
select 'copy  "e:\db files\'+file_name+'" "'+ physical_name +'"'  AS current_file_location from (
 SELECT physical_name ,
 LTRIM( RTRIM( REVERSE(  SUBSTRING(   REVERSE(physical_name),  0, CHARINDEX('\', REVERSE(physical_name),0) ) ) )) as file_name
FROM sys.master_files  s ) as a
order by physical_name


new2path.bat 內容
copy  "e:\db files\DB_COLLECT.mdf" "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\DB_COLLECT.mdf"
copy  "e:\db files\DB_COLLECT_log.ldf" "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\DB_COLLECT_log.ldf"
copy  "e:\db files\master.mdf" "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\master.mdf"
copy  "e:\db files\mastlog.ldf" "C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\mastlog.ldf"

....

停止新主機上的sql server 服務,相關的目錄建立好,再於新主機上執行 new2path.bat 將資料庫檔案copy 到對應的目錄,copy 完成後,啟動 sql server 服務,新的sql server 主機上的資料就與原主機相同,經測試移轉 18 G 的資料庫檔案,只花了 10分鐘完成此次移轉

不過移轉後發現,原主機上的維護計劃排程,會有無法正常執行情形
必需要重新新增維護計劃才會正常執行

2011年11月1日 星期二

如何在android 中查詢來電記錄使用日期過濾(CallLog filter DATE)

如何在android 中查詢來電記錄使用日期過濾
       cursor  = this.managedQuery(
                android.provider.CallLog.Calls.CONTENT_URI,
                strFields,               
                android.provider.CallLog.Calls.DATE+" >='"+sdate+"'",
                null,
                strOrder
                );
sdate='2011-11-1'
之前使用上列的字串日期來查詢,但總是傳回0筆資料               
為了解決這個問題,google查了好久,但始終找不到解法
最後決定由sqlite3 資料庫來查看要如何解決
來電記錄的 db 檔在 cd /data/data/com.android.providers.contacts/databases/contacts2.db 裏

先用 adb shell 進入 command shell
cd /data/dara/android.provider.contacts/databases/
sqlite3 contacts2.db
進入 sqlite3
先看一下來電記錄裏的資料長得怎樣
sqlite> select * from calls;
select * from calls;
1|0387232|1319211664323|0|1|1||0|
2|0387232|1319211858582|0|1|1||0|
3|0388709|1319715842190|8|1|1|huang|1|
4|0832413|1320148395215|2|1|1||0|

單獨select 出 date
sqlite> select date from calls;
select date from calls;
1319211664323
1319211858582
1319715842190
1320148395215

發現date 存在資料庫是 long 的數字型態,代表1970/1/1 至今的毫秒數
查了一下 sqlite3 的日期 function
可以用下列指令轉換為字串
SELECT datetime(date/1000, 'unixepoch') from calls;
2011-10-21 15:41:04
2011-10-21 15:44:18
2011-10-27 11:44:02
2011-11-01 11:53:15

終於得到正確的日期字串
再配合substr總算可以用字串日期過濾了
SELECT * from calls where substr(datetime(date/1000, 'unixepoch'),1,10)='2011-11-01';

把之前的query 條件改成下列
       cursor  = this.managedQuery(
                android.provider.CallLog.Calls.CONTENT_URI,
                strFields,               
                "substr(datetime("+android.provider.CallLog.Calls.DATE+"/1000, 'unixepoch'),1,10) ='"+sdate+"'",
                null,
                strOrder
                );
               
成功的傳回資料了