Pages

Subscribe:

Ads 468x60px

Labels

2013年11月16日 星期六

線上簽核-無紙化的最後一哩

作者:陳啟煌 / 臺灣大學計算機及資訊網路中心程式設計組副組長

清康熙三十五年六月初八,江寧織造曹寅上請安奏事摺給康熙,康熙朱批「知道了」,這個簡單的問候文書往返數百里,而今可於彈指間完成。
清康熙三十五年六月初八,江寧織造曹寅(曹雪芹的祖父)上請安奏事摺給康熙,康熙朱批「知道了」[1],這個看似簡單的問候文書,背後的的成本是驛站人馬來回數百里奔波,耗時數日。近年來科技日新月異,網路無遠弗界,只不過我們的文書處理流程竟與古人無異,同樣地傳送紙本,同樣地批示、簽名、用印;但這一切都可藉由線上簽核的施行而有所改觀,原本曠日廢時的文書往返流程,皆可於彈指之間完成。

線上簽核可帶來如此大的便利性,為何尚未普及?背後的因素不外乎在於大眾對於電子文件防偽及驗證制度的信任不足,造成行政單位在此最後一哩裹足不前。回顧以往老祖先在傳統書面文書的防偽驗證也下了不少功夫,如中國古時候調兵遣將用的虎符、西洋用的封蠟章(Wax Seal)火漆印等技術,也是累積多年的使用經驗,才建立了現在所使用的文書制度。這些技術最主要是用來證明文書由誰發出,且事後發文者無法否認發文。邁入電腦化時代,文件電子化後,因為電子文件修改不易留痕跡,防偽及驗證制度變得更加複雜。故要改用線上簽核,捨棄原有紙本簽章,除了要滿足傳統驗證的功能外,還要能驗證電子文件內容是否曾被竄改過。而這一些需求皆可以利用數位簽章技術一一克服。

近10年來,政府積極推動電子化政府計畫,而線上簽核是電子化政府重要的一環。臺灣在民國90年通過電子簽章法[2],使得國內數位簽章的實行有了法律的依據。在電子簽章法第十條規定數位簽章應依一定之程序製作始生效力,且須由管理機構認可之憑證發放機構 (Certificate Authority (CA) ) 發放之有效憑證為之。為此,行政院研考會依照國際標準規劃之GPKI (Government Public Key Infrastructure)架構,建置GCA(政府憑證管理中心)、MOECA(工商憑證管理中心)、MOICA(內政部憑證管理中心)、XCA(組織及團體憑證管理中心)等官方憑證管理中心,負責各種類憑證發放。目前發行量最大的憑證為內政部所發放的自然人憑證,截至98年7月已發行175萬張。而行政院研考會在97年推動的「電子識別證」,也是採「自然人憑證」與「實體識別證」二合一IC卡片,如下圖所示[3],正面為機關識別證顯性資料,背面為自然人憑證。有了官方的憑證才能推動各類公文書函線上簽核,達成無紙化的最後一步。

 
本校積極推動線上簽核系統建置,為了讓簽核的文件具有法律效力,規劃方向與政府電子化政府推動方向一致,皆以自然人憑證作為簽核憑證。現已完成「差勤線上簽核系統」,正朝下一步公文及電子表單線上簽核邁進。使用自然人憑證簽核或許有些人會擔心個人隱私被外洩,這一點其實不用太過擔心,因為自然人晶片卡內只存放少數個人資料[4]:包含公開區的公開金鑰、姓名、身分證字號末四碼、憑證序號及私密區的私密金鑰。而且私密金鑰的設計是無法被讀出晶片卡外,且需要輸入正確的PIN code才能使用,以作為資料的加解密之用。以自然人憑證作為簽核的依據能避免系統內的身份被盜用,且不會洩漏個人隱私。

完成了這個「最後一哩」的工程,不論您在世界上的那個個角落,只要連上網路,就能透過線上簽核系統,讓文件批核能在彈指之間完成,作一個名符其實的現代人。

參考資料[1] 故宮文物數位典藏計畫
      http://www.npm.gov.tw/da/ch-htm/prospect04-c.html
[2] 電子簽章法,全國法規資料庫
      http://law.moj.gov.tw/Scripts/Query4A.asp?FullDoc=all&Fcode=J0080037
[3] 行政院研究發展考核委員會--電子化政府推動現況及成果「電子識別證」
      http://www.rdec.gov.tw/ct.asp?xItem=4152195&ctNode=12146&mp=100
[4] 內政部自然人憑證管理中心,
      http://moica.nat.gov.tw/html/index.htm

雲端運算平台—Hadoop

作者:周秉誼 / 臺灣大學計算機及資訊網路中心作業管理組碩士後研究人員

雲端運算是資料中心因應網路上資訊暴增而提出的服務及管理思維,資訊服務提供者投入資源進行雲端運算的服務及架構開發,Google可說是最大量使用雲端運算的組織之一。Hadoop就是由Google雲端架構得到啟發而開始的開放原始碼計劃,目前有許多組織參與Hadoop的研究開發,並以Hadoop做為雲端運算的平台。
前言隨著網際網路 (Internet) 的發展,及web2.0概念被提出,網路使用者的行為也由單純的瀏覽轉變為創作與分享;另外,行動式的資訊設備也越來越多,為了方便分享及取用,使用者們把資料從個人的電腦中轉移到web服務提供者的資料中心 (Data Center);而服務提供者為了提供更穩定更迅速的服務,也需要一個新的服務架構,將運算資源及儲存空間更有效率的利用,同時提供服務開發人員更便利的開發環境。
雲端運算 (Cloud Computing) 就是將前述所有的需求整合在一起的概念,一個面向是讓使用者以更加便利的方式使用及取得服務,甚至用最簡單的方式開發新的服務。隨著各種雲端服務產生,對於運算能力及儲存空間的需求,也會驚人地成長,因此雲端運算的另一個面向就是整合組織內部運算資源,以最有效率、最易於管理的方式,提供雲端服務穩定的運算及儲存能量。
以Google為例,許多服務都以雲端運算的形式推出,讓使用者隨時可以取得自己的資料,也能夠透過網路跟其他人分享;還提供了相當便利的開發環境,如 Google App. Engine提供了介面和免費的運算及儲存資源,讓使用者開發各種有趣的web服務。但這些服務需要十分可觀的運算能力和使用者資料的儲存空間,因此,Google開發了許多雲端運算的技術與架構,如MapReduce以分散式運算提供整合的運算資源及減少運算時間、Google File System將大量而分散的儲存空間整合為一個可靠的儲存媒介、BigTable提供高效率的分散式資料庫。這些技術及架構都有一個特點,就是讓服務開發人員不用考慮在這些分散式系統上資料要怎麼放置、運算要怎麼切割,只需要專注在服務的開發就可以了,而資料與運算的切割及分散就交給雲端運算的架構來處理,可說是大大增加了開發服務的速度。
Hadoop計劃Hadoop是Apache軟體基金會 (Apache Software Foundation) 底下的開放原始碼計劃 (Open source project),最初是做為Nutch這個開放原始碼的搜尋引擎的一部份。Hadoop是以java寫成,可以提供大量資料的分散式運算環境,而且Hadoop的架構是由Google發表的BigTable及Google File System等文章提出的概念實做而成,所以跟Google內部使用的雲端運算架構相似。目前Yahoo!及Cloudera等公司都有開發人員投入Hadoop的開發團隊,也有將近一百個公司或組織公開表示使用Hadoop做為雲端運算平台,Google及IBM也使用Hadoop平台為教育合作環境。
Hadoop中包括許多子計劃,其中Hadoop MapReduce如同Google MapReduce,提供分散式運算環境、Hadoop Distributed File System如同Google File System,提供大量儲存空間、HBase是一個類似 BigTable 的分散式資料庫 (見表一),還有其他部份可用來將這三個主要部份連結在一起,方便提供整合的雲端服務。
MapReduceMapReduce是一個分散式程式框架,讓服務開發者可以很簡單的撰寫程式,利用大量的運算資源,加速處理龐大的資料量,一個MapReduce的運算工作可以分成兩個部份—Map和Reduce,大量的資料在運算開始的時候,會被系統轉換成一組組 (key, value) 的序對並自動切割成許多部份,分別傳給不同的Mapper來處理,Mapper處理完成後也要將運算結果整理成一組組 (key, value) 的序對,再傳給Reducer整合所有Mapper的結果,最後才能將整體的結果輸出 (見圖一)。

再更仔細地介紹流程中每一步的細節,一開始需要建立一個JobConf類別的物件,用來設定運算工作的內容,如 setMapperClass/setReducerClass設定 Mapper及Reducer 的類別,setInputFormat/setOutputFormat 設定輸出輸入資料的格式,  setOutputKeyClass / setOutputValueClass 設定輸出資料的類型,設定完成後,依設定內容提交運算工作。資料來源會依InputFormat的設定取得,並分割轉換為一組組的 (key, value) 序對,交由不同的Mapper同時進行運算,Mapper要將運算的結果輸出為一組組(key, value) 序對,也稱為中介資料 (intermediate),系統會將這些暫時的結果排序 (sort) 並暫存起來,等到所有Mapper的運算工作結束之後,依照不同的key值傳送給不同的Reducer彙整,所有同一key值的中介資料的value值,會放在一個容器 (container) 裡傳給同一個Reducer處理,所以在Reducer中可以利用values.next()依序取得不同value值,快速地完成結果整理,再依OutputFormat的設定輸出為檔案。
進行運算的Mapper和Reducer會由系統會自動指派不同的運算節點擔任,所以程式設計時完全不用做資料和運算的切割 (decomposition),運算資源會由JobTracker分配到各個運算節點上的TaskTracker,並指派不同的節點擔任Mapper和Reducer。

HDFSHadoop Distributed File System (HDFS) 將分散的儲存資源整合成一個具容錯能力、高效率且超大容量的儲存環境,在Hadoop系統中大量的資料和運算時產生的暫存檔案,都是存放在這個分散式的檔案系統上。
HDFS是master/slave架構,由兩種角色組成,Name node及data nodes,Name node負責檔案系統中各個檔案屬性權限等資訊 (metadata, namespace) 的管理及儲存;而data node通常由數以百計的節點擔任,一個資料檔會被切割成數個較小的區塊 (block) 儲存在不同的data node上,每一個區塊還會有數份副本 (replica) 存放在不同節點,這樣當其中一個節點損壞時,檔案系統中的資料還能保存無缺,因此name node還需要紀錄每一份檔案存放的位置,當有存取檔案的需求時,協調data node負責回應;而有節點損壞時,name node也會自動進行資料的搬遷和複製。
HDFS雖然沒有整合進Linux kernel,只能透過Hadoop的dfs shell進行檔案操作,或使用FUSE成為User space下的檔案系統,但Hadoop下的系統都與HDFS整合,做為資料儲存備份及分享的媒介。如前面提到的MapReduce在系統分配運算工作時,會將運算工作分配到存放有運算資料的節點上進行,減少大量資料透過網路傳輸的時間。

HBaseHBase是架構在HDFS上的分散式資料庫,與一般關聯式資料庫 (relational database) 不同。HBase使用列 (row) 和行 (column) 為索引存取資料值,因此查詢的時候比較像在使用map容器 (container);HBase的另一個特點是每一筆資料都有一個時間戳記 (timestamp),因此同一個欄位可依不同時間存在多筆資料。
一個HBase的資料表 (table) 是由許多row及數個column family組成,每個列都有一個row key做為索引;一個column family就是一個column label的集合 (set),裡面可有很多組label,這些label可以視需要隨時新增,而不用重新設定整個資料表 (見表二)。在存取資料表的時候,通常就使用 (‘row key’, ‘family:label’) 或 (‘row key’, ‘family:label’, ‘timestamp’) 的組合取出需要的欄位。

HBase為了方便分散資料和運算工作,又將整個資料表分為許多region,一個region是由一到數個列所組成的,可以分別存放在不同HBase主機上,這些存放region的主機就是region server,另外還有master server用來紀錄每一個region對應的region server;master server也會自動將不能提供服務的region server上的region重新分配到其他的region server上。
HBase也可供MapReduce的程式當作資料來源或儲存媒介,在HBase 0.20版之後提供了TableMapper及TableReducer的類別讓程式中的Mapper及Reducer類別繼承,可以把MapReuce中的 (key, value) 更方便地從HBase中取出和存入。
Web InterfaceMapReduce的JobTracker、HDFS、及HBase都有各自的web監控介面,可以及時觀察目前每個運算工作的運作情況、檔案系統的容量、及資料表和region的使用情況, 讓系統管理者輕鬆地監控大量資源 (見圖二、圖三、圖四)。


 


 
結論Hadoop是目前最常見且實際運用在大規模商業環境上的雲端運算平台之一,強大而完整的基礎架構可以減少大量的雲端架構開發的時間,大量部署時也相當迅速,不但有許多重量級的雲端運算服務提供者正在使用及投入開發,也與Google的雲端環境相似,使Hadoop成為教育訓練、學術研究及雲端服務開發的最佳平台。
雖然有Hadoop這麼便利的雲端運算環境,又有成功的雲端服務可以參考,然而在組織內部導入雲端運算的架構及文化時,仍需做好充分的規劃及時程表,不然將會影響原有服務的穩定及品質,不但不能享受雲端運算帶來的便利,反而徒然增加管理及營運成本,使雲端運算淪為失敗的行銷名詞。

古典玫瑰園 Rose House 集團官網 (古典玫瑰园)

古典玫瑰園 Rose House 集團官網 (古典玫瑰园)

2013年10月30日 星期三

搜索引擎優化 提高排名 如何提高排名

引用

Blog天生就得到搜尋引擎的喜愛,以至於排名總是較前。

◎Blog增加連結機會導致排名較前

不知道您在使用搜尋引擎時是否注意到,許多Blog的某篇文章經常排在搜尋結果前幾筆。這是意外嗎?其實只要理解搜尋引擎運作原理,就很容易知道何以Blog文章這麼討搜尋引擎喜歡。

搜尋引擎運作原理,筆者曾寫過「第三代網路行銷:搜尋引擎行銷」三篇。總結就是:1)增加網站內部網頁彼此連結,有助提高搜尋引擎排名;2)讓別人網站連結到你網站來,有助提高搜尋引擎排名。

一個典型的Blog網站,長得像這個樣子:

http://worker.bluecircus.net/

可以看到很多Blog網站常見的構成元素:日曆,文章分類,文章依月份(或年份)歸檔。每篇文章底部有「上一篇,下一篇」的連結。就是這些,在網站上增加了每篇文章彼此相互連結的機會。

此外,一般Blog還有Trackback 機制。簡言之,當別人在自己寫的文章中提到你的網站上某文章時,他除了建立連結連到你之外,還可以發送一個通知給你的網站,讓你的網站自動建立連結連回到他的網站。

跟外部網站的連結建立是如此自動化。因此我們常看到那些在搜尋結果排名靠前的Blog文章,往往都是被討論被連結最多次的文章。我們終於明白,Blog系統的呈現與運作方式,天生就符合搜尋引擎胃口。

◎搜尋引擎嗜食文字

除上述運作邏輯外,筆者在此補充幾點之前沒提到的搜尋引擎特性:

- 搜尋引擎喜歡文字很多的網頁

如果某個網頁上都是圖形,或者都是大量的連結連往別的網頁,該網頁在搜尋引擎是拿不到高分的,排名也無法靠前;搜尋引擎自有辦法判斷網頁上的文字內容是有意義的文字還是垃圾。

請參考這兩種頁面:

http://www.digitalwall.com/all

http://www.digitalwall.com/scripts/year.asp?txtYear=2006

同樣是站內文章列表,前者網頁僅將標題列出並做連結,後者除此之外還將內文第一段呈現出來在網頁上,讓網頁上具有更多有意義的文字。結果是,後者在搜尋引擎的排名上大獲全勝。

您是否發現,幾乎所有的Blog網頁上都充滿著大量文字。即使是首頁上充斥著文章標題列表,在標題之外也會順帶把第一段呈現出來先讓你看一下。在此,我們又再度看見了Blog在搜尋引擎上的排名優勢。

◎搜尋引擎喜新厭舊

回到我們對企業網站的討論上。相信大家對於「企業網站」一定不陌生,你很容易可以猜到上面一定有「公司簡介」,「產品介紹」,「最新消息」,「聯絡我們」,「企業徵才」,以及此類內容的延伸。

很無趣嗎?是很無趣!也難怪當企業主面對能飛天遁地的 Web 2.0時,完全想不出來該拿自己公司的網站怎麼辦!其中,對於搜尋引擎排名最致命的一點,就是這些內容幾乎不會更新。

一個很久沒有更新的網頁,在搜尋引擎的排名會被新的相關網頁往下擠,因為搜尋引擎喜歡新鮮的內容。一個頁面常常有更動的部分,會被搜尋引擎認為還「活著」。

想來想去,好像只剩「最新消息」會是常更新的部份。一個竅門是,讓你的網站上每個網頁都出現「最新消息」內容。請看範例:

http://www.digitalwall.com/scripts/display.asp?UID=358

頁面上主要內容文章已經寫完,未來很少有機會更新。但網頁右側部分卻可看到有個「近日產業動態」,那些內容是每天甚至每小時都在變動。對搜尋引擎來講,這整個網頁就是新鮮的,因為有變動的部份。

你或許發現了。每一個Blog網站上的每一篇文章或每一個網頁上,幾乎都有最新文章或者最新消息的連結。是的,這是Blog為什麼老是能拿到搜尋引擎排名前幾名的一個原因:他的每個網頁都是最新鮮的。

◎效果才是王道啦!管他幾點零

前些時候筆者和 1.0時代搞網路革命的老戰友工頭堅在 MSN上閒聊,問說是否感覺筆者的網站數位之牆最近在改版。他的第一個反應是:「有,變得 Web 2.0化了」。

這實在是個誤解。筆者網站使用老舊的 ASP 3.0,先前在加入 RSS機制時就已經吃足苦頭。改版目的是改善網站在搜尋引擎的排名(即所謂「搜尋引擎優化」),沒想到越改和當下流行的Blog介面越來越像。

這件事告訴我們,如果 1.0企業網站決心拉高搜尋引擎排名,改到後來會跟Blog很像,而企業主可能從沒聽過 Web 2.0,還被以為是跟風流行。事實上企業主很現實,能帶來客戶的就是好技術,管他幾點零。

此外,如果你公司從來就沒有網站,或者你懶得理解筆者解釋的這麼多原理,建議直接用Blog系統去架設網站會省力得多,反正效果一樣,像筆者這樣搞改版很辛苦。企業網站的 2.0之路,走來並不容易。

資料來源

mysql 指令收集

平常只下SQL Command
但一些權限指令都快忘光了
這邊也有詳盡介紹:http://businesswing.net/webdesign/php-cmd_data_export_and_import/#more-1958


mysql 忘記密碼
安裝完成後在OS Command Line 更改Root Password
1.先停掉mysql 
/etc/rc.d/init.d/mysql stop 

2.以--skip-grant-table 的參數啟動mysql 
safe_mysql --skip-grant-table& 

3. 更改root 密碼 
# mysql mysql 
mysql> UPDATE user SET password=password('newpassword') 
WHERE user='root'; 
mysql> exit 

4.停掉mysql再重跑 
# mysqladmin -uroot -p shutdown 
Enter password: //輸入新設定的密碼 

# /etc/rc.d/init.d/mysql start



//登入
mysql -u root -h hostname -p

// show 出資料庫
show databases;

//使用資料庫
use 資料庫名稱;

//檢查使用中的資料庫
select database();

//秀出資料庫
shell指令mysqlshow
mysql下 show databases;

//顥示連結的狀態
status

//秀出資料庫使用狀況
select database();

//秀出資料庫內的資料表名稱
show tables;

//秀出資料庫欄位名稱及內容
describe 資料表名稱;

//加入新的資料至欄位
INSERT INTO manber( 欄位, 欄位, )
VALUES ( '插入字串' , '插入字串' );

//加入欄位至資料庫尾端
ALTER TABLE `TABLE_NAME` ADD `新增欄位名稱` VARCHAR( 5 ) ;

//show 出 資料表內所有的內容
select * from 資料表名稱;

// show 出資料表後匯入一個新的文件
mysql -u root -hhostname -p -e "select * from cd limit 1" > 匯出的名稱

// 搜尋某筆的資料
select * from table名稱 where type_id='24';

//修改芋筆的資料
update table名稱 set 欄位1='5' where 欄位2='24' limit 5;

//記算資料庫筆數
select count(櫚位名) from table_name ;

select count(*) from table_name ;

timestamp下
select 櫚位名1,count(*) from table_name where Time < timename_timestamp('2003-5-8 12:0:0') group by 欄位名1 ; //亂數 select select * from twble_name order by rand() ; //新增資料 insert into 資料庫名稱(欄位1,欄位2) values(資料1,資料2); //刪除資料 delete from 資料庫名稱 ; //不用加星號 shell> mysqladmin -u root password "newpwd"
shell> mysqladmin -u root -h host_name password "newpwd"


Windows環境中,Login Mysql後,更改Root Pasword

shell> mysql -u root
mysql> SET PASSWORD FOR ''@'localhost' = PASSWORD('newpwd');
mysql> SET PASSWORD FOR ''@'%' = PASSWORD('newpwd');

Unix環境中,Login Mysql後,更改Root Pasword

shell> mysql -u root
mysql> SET PASSWORD FOR ''@'localhost' = PASSWORD('newpwd');
mysql> SET PASSWORD FOR ''@'host_name' = PASSWORD('newpwd');

查詢資料庫清單

shell> mysql -u root
mysql> SHOW DATABASES ;

建立資料庫

shell> mysql -u root
mysql> Create database DB_Name;

建立使用者及密碼,並賦予所需之權限

shell> mysql -u root
mysql>GRANT ALL PRIVILEGES ON DB_Name.*
TO User_Name@localhost IDENTIFIED BY 'newpwd'

更改使用者密碼

shell> mysql -u root
mysql> UPDATE mysql.user SET Password = PASSWORD('newpwd')
WHERE User = 'root';
mysql> FLUSH PRIVILEGES;

MySQL 常用的設定和指令記錄, 採 FAQ 方式記錄. 
MySQL 匯入 sql 指令
 
mysql -u userid -p [-h localhost] db_Name < xxxxx.sql
 
MySQL 於 mysql> 使用 less 看結果
pager less -n -i -S
直式列出 query 結果
SELECT * FROM TABLE_NAMEG
設定 mysql> 變成 (user@host) [(dbname)]>
於 .bashrc 加一行
export MYSQL_PS1="(u@h) [d]> "
MySQL 看 status
show status; 或 mysqladmin -u root -p status
MySQL 要讓 localhost 以外的 Client 連進來
/etc/mysql/my.cnf 拿掉 bind-address = 127.0.0.1 即可
MySQL 秀錯誤編號, 該如何查此編號對應的原因?
MySQL error 編號, 在 shell 下打 "perror 編號" 就可知道原因了, Example:
$ perror 134 MySQL error: 134 = Record was already deleted (or record file crashed) mysql error code shell> perror 12 System error: 12 = Cannot allocate memory
Check Table 是否有錯誤
CHECK TABLE tbl_name [fast] [quick], 詳可參見: 此連結
於系統運作下, 修復 TABLE
repair table table_name, 詳可參見: 此連結
MySQL 停止後, 於 shell 下修復 TABLE(MyISM)
myismchk /mysql/data/TABLE_NAME.MYI
MySQL 只 dump table 的 schema
使用此參數: --no-data, -d mysqldump -d -u root -p DB_NAME TABLE_NAME > TABLE_NAME.sql
MySQL 只 dump db 的 schema
使用此參數: --no-data, -d mysqldump -d -u root -p DB_NAME > DB_NAME.sql
MySQL 只 dump db 的 data
-c: SQL 語法前面會把欄位名稱也列出來 -t: Table mysqldump -u root -p -t -c DBNAME > DB_ALL_DATA.sql 或 mysqldump -u root -p -t DBNAME > DB_ALL_DATA.sql
MySQL 只 dump table 的 data
-c: SQL 語法前面會把欄位名稱也列出來 -t: Table mysqldump -u root -p -t -c DBNAME TABLENAME > DB_TABLE_DATA.sql 或 mysqldump -u root -p -t DBNAME TABLENAME > DB_TABLE_DATA.sql
Query 指定使用哪個 index 的語法
SELECT COUNT(*) FROM TABLE_NAME USE INDEX(XXX_idx)
看此 table_name 使用多少容量、空間
show table status like 'table_name';
看 table 如何 create 的
mysql> show create table table_name
如何看 mysql bin log
mysqlbinlog m10-relay-bin.001
如何看 SQL 語法使用到哪個 Index Key
mysql> EXPLAIN SELECT * FROM User
如何設定把 所有 對此 MySQL 所下的 SQL 語法都記錄下來
my.cnf [mysqld] log = /var/logs/mysql/mysql-query.log
如何找出 MySQL column欄位中的值不等於 0-9 的
SELECT * FROM TABLENAME WHERE column REGEXP '[^0-9]';
要將資料倒回 DB 的標準做法(若有設 Foreign Key 用此方法才能順利匯入)
  • mysql> SET FOREIGN_KEY_CHECKS = 0;
  • mysql> SOURCE dump_file_name;
  • mysql> SET FOREIGN_KEY_CHECKS = 1;
    設定 root 和其他 user 的密碼
    • mysqladmin -u root password '新密碼'
    • mysqladmin -u root -p
    • Enter password:    此時再輸入密碼(建議採用)
    • use mysql;
      mysql> UPDATE user SET password=password('新密碼') where user='root'; 
        只改 root 的密碼,如果沒有用 where ,則表示改全部 user 的密碼
    • mysql> FLUSH PRIVILEGES; 在 mysql 資料庫內,一定要用 flush 更新記憶體上的資料
    刪除空帳號
    • mysql> DELETE FROM user WHERE User = '';
    • mysql> FLUSH PRIVILEGES;
       
    建立新帳號
    • mysql> GRANT 權限 ON 資料庫或資料表 TO 使用者 IDENTIFIED BY '密碼';
        權限
         
        資料庫或資料表
         *.* 所有資料庫裡的所有資料表
         * 預設資料庫裡的所有資料表
         資料庫.* 某一資料庫裡的所有資料表   
         資料庫.資料表 某一資料庫裡的特定資料表
         資料表  預設資料庫裡的某一資料表
    設定/修改權限  
    • 用 root 登入 MySQL
        mysqladmin -u root -p
       Enter password:   
    • mysql> GRANT all ON db35.* TO s35@'localhost' IDENTIFIED BY 's35';
         把 db35 這個資料庫(含其下的所有資料表),授權給 s35,從 localhost 上來,密碼為s35
       
    • mysql> GRANT all ON *.*  把所有資料庫及資料表授權給別人,太危險了!
       
    • mysql> GRANT all??? ON www.* TO '*'@'*' IDENTIFIED BY '';
          把 www 這個資料庫(含其下的所有資料表),授權給 任何機器任何人,無密碼(通常給不特定人士使用)
       
    • mysql> FLUSH PRIVILEGES;   (最後一定要強迫更新權限)

    MySQL指令大全

    基本指令 :

    資料定義語言 ( DDL ) :

    建立資料庫或資料表 :   create
    更變資料庫或資料結構 :   alter
    刪除資料庫或資料表 :   drop

    資料操作語言 ( DML ) :

    查詢資料 :   select
    插入資料 :   insert
    更新資料 :   update
    刪除資料 :   delete

    資料控制語言 ( DCL ) :

    確定資料的更變 :   commit
    設定使用者對資料的操作權限 :   grant
    取消使用者操作資料的權限 :   revoke
    取消資料更變 :   rollback




    實用指令 :

    顯示所有資料庫 :   show databases;
    選擇某一資料庫 :   use 資料庫名稱;
    列出資料庫底下的資料表 : show table from 資料庫名稱;
    顯示目前正在使用的資料表 :   show tables;
    顯示資料表欄位設定 :   describe 資料表名稱;
    重新整理資料表 :   optimize table 資料表名稱;
    顯示某個資料表的欄位設定 :   show columns from 資料表名稱;
    顯示某個資料表的索引欄位設定 :   show index from 資料表名稱;




    顯示 :

    1.顯示所有資料庫 :   show databases;
    2.顯示資料庫底下的資料表 : show table from 資料庫名稱;
    3.顯示資料表的欄位 :   show columns from 資料表名稱;

    顯示目前正在使用的資料表 :   show tables;
    顯示資料表欄位設定 :   describe 資料表名稱;
    顯示某個資料表的索引欄位設定 :   show index from 資料表名稱;



    新增 :

    1.新增資料庫 : create database 資料庫名稱;
    2.新增資料表 : create table 資料表名稱 ( 欄位名稱1 資料型態,欄位名稱2 資料型態 );
    3.新增欄位 : alter table 資料表名稱 add 欄位名稱 資料型態;


    修改 :

    3.修改資料表 : alter table 舊資料表名稱 rename 新資料表名稱; 
    修改欄位刪除 : alter table 資料表名稱 drop 欄位名稱

    刪除 :

    1.刪除資料庫 : drop database 資料庫名稱;
    2.刪除資料表 : drop table 資料表名稱;
    3.刪除欄位 : drop 欄位名稱;

    欄位刪除 : alter table 資料表名稱 drop 欄位名稱

    MySQL 指令、語法及管理

    這是一份筆記,專門紀錄 towns 在操作時需要的語法、指令或操作方式,還有更多的資料分散在茫茫網海中等待大家的發覺,感謝每一位大大無私的奉獻
    教學網站:http://www.hmes.kh.edu.tw/~jona/redhat/mysqlphp/mysqlsyntax.htm
    官方語法說明:http://dev.mysql.com/doc/refman/5.1/zh/sql-syntax.html



    =================================================================
     
    1、設定管理帳號:(mysql在安裝後,會建立一個root帳號,不過,沒有密碼)
    mysqladmin -u root password abc123 <==設定root帳號,密碼為abc123
    ==================================================================
    2、列出mysql現行環境
    mysqladmin variables -u root -p <==使用指令
    mysql>show variables; <==使用mysql語法
    ==================================================================
    3、登入資料庫
    mysql -u root -p towns <==使用root帳號,登入towns資料庫
    mysql -h localhost -u root -p towns <==使用root帳號登入本機端的towns資料庫, 做網路管理時,-h很重要
    ==================================================================
    4、建立資料庫
    4.1 mysql -u root -p <==使用root登入mysql
    4.2 打入root密碼
    4.3 create database towns; <==使用mysql語法,新增towns這個資料庫,“;”一定要加
    4.4 mysqladmin -u root create cacti -p <==也可以用指令建立資料庫
    ===================================================================
    5、刪除資料庫
    5.1 mysql -u root -p <==使用root登入mysql
    5.2 打入root密碼
    5.3 drop database towns; <==使用mysql語法,刪除towns這個資料庫,“;”一定要加
    ===================================================================
    6、列出現有資料庫
    6.1 mysql -u root -p <==使用root登入mysql
    6.2 打入root密碼
    6.3 show databases;
    6.4 mysql -e "show databases; " -p <==用指令顯示資料庫
    6.5
    6.1 mysqlshow -u root -p <==使用root登入mysql,並列出所有的資料庫
    6.2 mysqlshow -u root -p towns <==使用root登入mysql,並列towns資料庫中的資料表
    6.3 mysqlshow -u root -p towns towns <==使用root登入mysql,指定towns資料庫,並列出towns資料表
    資料來源:http://tsuozoe.pixnet.net/blog/post/21283890
    ===================================================================
    7、匯入資料庫
    7.1 需先建立資料庫(如4),可以看一下,dump下來的語法中,是否有下CREATE DATABASE,有就不用建了
    7.2 mysql -u root -p abc <'/home/towns/abc/abc.sql' <==將abc.sql匯入abc資料庫中
    7.3 如語法中,有下CREATE DATABASE,有就不用建了
    7.4. mysql -u root -p <'/home/towns/abc/abc.sql' <==將abc.sql匯入資料庫中(必需有CREATE DATABASE)
    ===================================================================
    8、匯出資料庫
    8.1 資料庫需存在
    8.2 mysqldump -u root -p abc >'/home/towns/abc/abc.sql' <==將abc資料庫匯出到abc.sql檔案
    8.3 mysqldump -u root -p -d abc > '/home/towns/abc/abc.sql' <==將abc資料庫的結構匯出到abc.sql檔案
    ===================================================================
    9、新增使用者(需先登入mysql server)
    9.1 使用grant新增
     9.1.1 grant all on abc.* to towns identified by 'abc123' with grant option;
     建立towns使用者具有abc完整的管理權,密碼為abc123
     9.1.2 grant all on abc.* to towns@localhost identified by 'abc123' with grant option;
     建立本機端towns使用者具有abc完整的管理權,密碼為abc123
     9.1.3 grant all on *.* to towns@localhost identified by 'abc123' with grant option;
     建立本機端towns使用者具有所有資料庫完整的管理權,密碼為abc123
     9.1.3.1 grant all on *.* to towns@localhost identified by 'abc123';
     與上面的方法相同,獨缺“允許特權”
    9.2 使用INSERT
    9.3 CREATE USER
    --------------------------------------------------------------------------------------------
    9.4 變更密碼
    9.4.1 grant all on *.* to towns@localhost identified by '123abc' with grant option;
    將towns使用者的密碼,由abc123變成123abc
    9.4.2 SET PASSWORD FOR 'root'@'localhost.localdomain' = PASSWORD( '*******' )
          SET PASSWORD FOR 'root'@'localhost' = PASSWORD( '*******' )
    ===================================================================
    10、刪除使用者
    10.1 DELETE FROM mysql.user WHERE User='towns' ;
    刪除使用者towns
    10.2 DROP USER test@localhost;
    ===================================================================
    11、登入資料庫帳號、密碼常見檔案位置
    ===================================================================
    12、更新資料庫資料(在做任何更動後,建議要使用這指令)
    12.1 flush privileges;
    ===================================================================
    13、在作業系統中,檢查權限之命令
    13.1 mysqlaccess localhost user mysql -U root -P abc123 <==檢查user帳號的權限
    13.2 mysqlaccess localhost towns abc123 -U root -P abc123 <==檢查towns帳號的權限
    13.3 mysqlaccess localhost towns -U root -P <==檢查towns帳號的權限,會要求打入root 密碼
    ===================================================================
    14、權限管理
    14.1 grant SELECT,INSERT,UPDATE on abc.* to towns@localhost identified by 'abc123';
    開放三種權限(SELECT,INSERT,UPDAT)給towns(本機端)
    14.2 開放多個資料庫(abc1、test、abc)給一個帳號(towns)管理,需一條一條加
    grant all on abc1.* to towns@localhost identified by 'abc123';
    grant all on test.* to towns@localhost identified by 'abc123';
    grant all on abc.* to towns@localhost identified by 'abc123';
    --------------------------------------------------------------------------------------------
    14.3 權限
    資料庫(DateBase),十五種權限:
    ALL PRIVILEGES、ALTER、CREATE、DELETE、DROP、FILE、INDEX、INSERT、PROCESS、REFERENCES、RELOAD、SELECT、SHUTDOWN、UPDATE、USAGE
    資料表(Table),八種權限:
    SELECT、INSERT、UPDATE、DELETE、CREATE、DROP、INDEX、ALTER 
    資料欄(column),三種權限:
    SELECT INSERT UPDATE
    修改權限
    14.4 REVOKE 權限 ON 資料庫(或資料表TABLE) TO user@host IDENTIFIED BY '密碼';
    ===================================================================
    GRANT ALL PRIVILEGES ON `abc` . * TO abc@% WITH GRANT OPTION ;
    DROP USER towns@';
    DROP USER test@localhost';
    ---------------------------------------------------------------------------------------------
    CREATE USER test@localhost IDENTIFIED BY '********';
    GRANT USAGE ON * . * TO test@localhost IDENTIFIED BY '********' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
    SET PASSWORD FOR root@localhost = PASSWORD( '*********' ) <==在資料庫中修改密碼方式
    ===================================================================
    16.忘記root密碼處理方式
    Linux:
    1.使用root登入
    2.停止mysql服務(for redhad base)
    service mysqld stop
    3.使用mysqld_safe指令
    mysqld_safe --skip-grant-tables &
    此時,會開啟一個安全模式,並停住
    4.開新的ssh,用root登入系統
    5.使用mysql帳號登入mysql中
    6.變更mysql中root密碼
    update user set password = password('abc123') where user = 'root';
    7.離開mysql
    8.重新啟動mysql
    9.使用root新密碼登入mysql
    -----------------------------------------------------------------------------------------------
    Windows:
    1.用系統管理員登陸系統。
    2.停止MySQL的服務。
    3.進入命令視窗,然後進入MySQL的安裝目錄,比如我的安裝目錄是c:\mysql,進入C:\mysql\bin
    4.跳過許可權檢查啟動MySQL,
    c:\mysql\bin>mysqld-nt --skip-grant-tables
    5.重新打開一個視窗,進入c:\mysql\bin目錄,設置root的新密碼
    c:\mysql\bin>mysqladmin -u root flush-privileges password "198651"
    c:\mysql\bin>mysqladmin -u root -p shutdown
    將newpassword替換為你要用的root的密碼,第二個命令會提示你輸入新密碼,重複第一個命令輸入的
    密碼。
    6.停止MySQL Server,用正常模式啟動Mysql

    7.你可以用新的密碼連結到Mysql了。
    命令:
    net mysql start 啟動MYSQL
    net stop mysql 停止MYSQL

    下面以在Windows系統上為例,linux上將步驟 4 的mysqld-nt換為safe_mysqld即可
    1 、停止mysql5服務:
    net stop mysql5
    2、開一個DOS視窗執行:
    http://www.mscto.com
    c:\mysql\bin>mysqld-nt --skip-grant-tables &
    3、再開一個DOS視窗執行:
    c:\mysql\bin>mysql mysql
    > update user set password = password('123456') where user = 'root';
    root密碼即為設置為123456!
    4、啟動mysql5服務:
    net start mysql5
    ===================================================================
    17.顯示目前mysql連線的threads狀態
    mysql>show processlist; <==使用mysql語法
    mysqladmin processlist -u root -p <==使用指令
    ===================================================================
    18.列出MySQL目前的狀態
    mysql> show status; <==使用mysql語法
    mysqladmin status -u root -p <==使用指令(結果不同)

    ===================================================================
    19.列出mysql的使用者
    SELECT User FROM mysql.user Order by User;
    帳號管理
    mysql中,帳號可設為僅本機使用、僅網路使用、兩者皆可,與mysql安全性有關
    mysql>grant all on *.* to towns@localhost identified by 'abc123' with grant option;
    利用語法建立towns可以管理所有資料庫、只能本機連線,擁有最大權限
    mysql>grant all on *.* to towns@localhost identified by 'abc123';
    利用語法建立towns可以管理所有資料庫、只能本機連線,少了grant權限,其他都有
    mysql>grant all on *.* to towns@ identified by 'abc123' with grant option;
    利用語法建立towns可以管理所有資料庫、能外部及本機連線,擁有最大權限
    mysql>grant all on *.* to towns identified by 'abc123' with grant option;
    利用語法建立towns可以管理所有資料庫、能外部及本機連線,擁有最大權限
    towns@locahost <==只能本機連線
    towns@192.168.8.176 <==只能192.168.8.176連線,用於限制帳號連線IP
    towns@127.0.0.1 <==只能本機連線
    towns@locahost.localdomain <==只能本機連線
    towns@ <==不限制連線來源,危險的設定,不過local不能連
    towns    <==不限制連線來源,危險的設定
    註:使用 towns@ 及 towns 在 mysql5 以上的版本會發生仍無法遠端連線,因為 mysql5 以上的版本多加了兩個特別的帳號,@localhost 及 @[hostname],這兩組帳號在我們設定帳號時,如果沒有給尾巴,會自動加上去,造成帳號不論local 或 遠端都無法連入
    19.1. mysql -e "GRANT ALL PRIVILEGES ON test.* TO test@localhost IDENTIFIED BY 'test' ; "
       利用指令來新增帳號
    ===================================================================
    20.資料庫匯出管理
     1. 更換資料庫
    登入mysql後,選用某個資料庫
    mysql> use test; <==連入test資料庫
     2 .顯示資料庫的資料表(需先選好資料庫,才能show tables)
    mysql> show tables;
    mysql -e "use test; show tables; " -p <==直接使用指令下SQL語法,並使用root登入(沒設user預設為root)
     3. 顯示特定資料表中的欄位
    mysql> describe table_name;
    ===================================================================
    21.免密碼登入mysql資料庫(用於資料庫定期備份等……)
     1.vim ~/.my.cnf
       [client]
       password=YOUR_MYSQL_PASSWORD
     2.chmod 600 ~/.my.cnf
    設定完成後,直接使用mysql -u [user],就可以登入了
    資料來源:http://plog.longwin.com.tw/my_note-unix/2009/04/09/mysql-login-backup-script-no-password-2009

    22. 關於帳號問題:當建立最大權限帳號後,該帳號無法本機登入
     1. 安裝後系統自動產生的帳號,兩個空白(@localhost、@localhost.localdomain)及三個root (root@localhostroot@127.0.0.1root@localhost.localdomain)帳號
     2. 此時 root 帳號可以本機登入,不可遠端登入
     3. 建立 towns 帳號後(建立最大權限帳號),towns 只能遠端登入,無法本機登入
     4. 建立 towns@localhost 帳號,towns 可以本機登入
    兩個空白帳號為安全性帳號,當我們使用towns登入時,沒寫完整帳號,會自動帶入@localhost,導致最大權限帳號無法本機登入,將兩個空白帳號刪除後,最大權限帳號(towns),就可以本機登入了。而這兩個空白帳號 towns 是透過第三方軟體,才刪除的

    23. mysql 連線數設定
    Linux 系統:my.cnf 檔中預設並無此參數,需手動加入
    設定 /etc/my.cnf
    max_connections=100 <==連線上限100
    max_user_connections=15 <==使用者連線上限15
    也可以設定單一帳號最大連線數,登入mysql後使用語法修改
    grant all on *.* to towns with MAX_USER_CONNECTIONS 15 ; <== towns帳號最大連線數為15
    windows 系統:在安裝設定時configuration Wizard即有詢問Concurrent Conections,自定值可到1400
    設定 C:\Program Files\MySQL\MySQL Server 5.1\my.ini
    max_connections=2037 <==連線上限 2037

     24. 使用phpmyadmin 設計資料庫
    教學:http://sofree.cc/phpmyadmin-mysql/

     25. 改變mysql 預設參數
    需修改 /etc/my.cnf檔
    例1:變更預設封包大小(max_allowed_packet)
    在[mysqld] 下面加入一行
    max_allowed_packet = 20M
    存檔後,重新啟重mysql
    使用mysqladmin variables -u root -p 確認 預設封包值是否已變更
    例2:變更資料庫預設語(character_set_server),這個只有mysql 4 才須要改
    character_set_server = utf8
    存檔後,重新啟重mysql
    使用mysqladmin variables -u root -p 確認character_set_server 及 character_set_database 是否變為 utf8
    註:不同的下指令方式得到不同的結果
    towns 使用 mysqladmin variables -u root -p 出現了以下五個值皆改為UTF8
    character_set_client
    character_set_connection
    character_set_database
    character_set_results
    character_set_server
    towns 登入資料庫後(mysql -u root -p),再使用 show variables;,得到以下結果
    character_set_client  ==> latin1
    character_set_connection  ==> latin1
    character_set_database ==> utf8
    character_set_results ==> latin1
    character_set_server ==> utf8

     26. 資料庫編碼轉換問題
    這個問題只會出現在 mysql 4版中
    使用指令 SET NAMES utf8;將character_set_client、character_set_connection、character_set_results改為 UTF8,這個是臨時性的修改相關資料:感謝前輩說明 http://chiouss0817.wordpress.com/2006/05/15/internal-charset-conversion-of-mysql/

    27. 免密碼登入mysql
    這個在備份時很好用
        vim /home/towns/.my.cnf <==建立或編輯.my.cnf檔
            [client]                                       <== 加入這兩行,[ ]中是打下密碼
            password= [mysql password] 
        chmod 600 ~/.my.cnf <==調整檔案權限

    28. mysql 效能觀察與調整
     

    29. Mysql UTF-8 中文排序問題
    towns在匯資料到Mysql資料庫中,如果欄位資料為中文UTF-8,會出現排序異常的情形,找了一些資料提供大家參考
     1.SELECT * FROM `test` ORDER BY CONVERT(`name` USING big5) DESC
     2.
    註:DESC為大到小,ASC為小到大