寫教學的最大目的是教會未來的自己

mysql

強大的資料庫熱備份軟體 xtrabackup

最近我們公司網站碰到一個嚴重問題

就是原先使用的galera 的同步系統時有一個嚴重缺陷,就是 在 DB 故障再重新同步後,會造成另一台DB 也鎖死,雖然仍可以讀取但沒鳥用啊…..

當然這個問題 可以透過 架設三台來解決,但是 這成本太高…..

 

之後我們就找到一個很強的備份系統 xtrabackup

他 是直接在DB的檔案層做備份,針對innoDB 備份 可以做到快速熱備份

可以多線同時備份,可以快速壓縮,可以快速還原

經過測試在50G的資料量 備份可以在兩分鐘內完成,還原也只需要五分鐘(mysqldump大概要10~20倍的時間)

他可以全部備份、局部備份、增量備份,不過並不建議增量備份,他還原很麻煩…

 

不過他還是有缺點的

1.innodb的 ibdata檔案過大時,會備份很久,我在測試時只要兩分鐘,實際上機 要20分鐘….

2.有MYSYIAM 時會有鎖表的備份,所以使用前請小心

3.當備份時碰到鎖表時會備份 拜請小心

4.局部備份跟還原 不是很方便,也不建議使用(有要使用此功能的 請使用2.2版)

 

 

官方網站:https://www.percona.com/doc/percona-xtrabackup/2.4/index.html

Post to Twitter Post to Plurk Post to Facebook Send Gmail

MYSQL 轉mariaDB+galera的兩三事

前幾個月我們公司的網站的資料庫系統從MYSQL 5.1.3轉移到mairaDB ,其中最大的目的就是使用galera 同步技術,這當中碰到一些狀況…..

這一篇 主要就是說明一些我所知道的事,至於怎麼安裝的,請自己google吧…..

 

 

一開始我要說的是”MYSQL 轉 mariaDB 不保證完全相容….”,沒錯就是不完全相容,架設你的網站用的SQL 有點複雜,強烈建議先去測試一下,個人猜測是這樣的,mariaDB 只保證 從他所說的MYSQL版本移植過去是相容的,其他版本號不保證,另外因為mariaDB有些加速的手法會導致部分語法失靈,個人目前碰到兩種狀況 閱讀全文

Post to Twitter Post to Plurk Post to Facebook Send Gmail

網站平移備份

最近在做網站的測試,所以開了 台測試server,要把網站的資料複製到測試server

本來我都是 先把MYSQL 匯出、FTP 下載所有檔案

 

最近我學到新的快速方法

參考資料 http://jashliao.pixnet.net/blog/post/164556993-%E6%AF%8F%E5%A4%A9%E4%B8%80%E5%80%8Blinux%E6%8C%87%E4%BB%A4–scp%E6%8C%87%E4%BB%A4%28%E9%81%A0%E7%AB%AF%E6%AA%94%E6%A1%88%E5%8A%A0%E5%AF%86%E6%8B%B7%E8%B2%9D-

 

1. 檔案水平轉移法

scp -r /home/XXX/public_html/* XXX@IP:/home/XXX/public_html

用法和 cp 相同 -r : 轉移資料夾

從本地 複製到 遠端特定IP 的特定資料夾

倒過來寫也OK 可以從遠端抓資料過來

 

2.MYSQL 水平備份

mysqldump -u [SOURCE_userid] -h [SOURCE_IP] -e -q –password=[SOURCE_PASSWORD] SOURCE_db_Name | mysql -u [DISTANCE_userid] –password=[DISTANCE_PASSWORD] -h [DISTANCE_IP] DISTANCE_db_Name

 

這是直接把DB dump出來後直接匯入到 另一台DB 中,不過要特別注意 如果資料庫太大 超過連線時間 會直接炸開喔

Post to Twitter Post to Plurk Post to Facebook Send Gmail

MYSQL透過 SQL_CALC_FOUND_ROWS取得資料總筆數

參考自:http://blog.farmer.idv.tw/?p=250

http://ma-bank.com/item/998

 

通常我們碰到資料量大的結果,我們會使用分頁的方式來呈現,那分頁的方式我們會使用到limit的方式,但是這有個缺點,我們不知道解果有多少個,通常我們會下兩次SQL,一次取得資料總量,一次取資料 但這太麻煩了,現在有個快速的好方法

 

在 SELECT  A,B,C FROM….WHERE 語句中 加入 SQL_CALC_FOUND_ROWS

變成

SELECT SQL_CALC_FOUND_ROWS  A,B,C FROM …. ..WHERE

他是參數不是資料欄位所以不需要用逗點隔開

之後只需要用

 SELECT FOUND_ROWS() 就可以取出剛剛SELECT 結果的資料總量,就算是有使用LIMIT也一樣

Post to Twitter Post to Plurk Post to Facebook Send Gmail

提升資料庫 (SQL)效能

引用自 http://blog.xuite.net/j2ee/code/15120677-調校+SQL+以徹底改善應用程式效能

單純引用 給自己看

有些程式員在撰寫前端的應用程式時,會透過各種 OOP 語言將存取資料庫的 SQL 陳述式串接起來,卻忽略了 SQL 語法的效能問題。版工曾聽過某半導體大廠的新進程式員,所兜出來的一段 PL/SQL 跑了好幾分鐘還跑不完;想當然爾,即使他前端的 AJAX 用得再漂亮,程式效能頂多也只是差強人意而已。以下是版工整理出的一些簡單心得,讓長年鑽究 ASP.NET / JSP / AJAX 等前端應用程式,卻無暇研究 SQL 語法的程式員,避免踩到一些 SQL 的效能地雷。

1、資料庫設計與規劃

• Primary Key 欄位的長度儘量小,能用 small integer 就不要用 integer。例如員工資料表,若能用員工編號當主鍵,就不要用身分證字號。

• 一般欄位亦同。若該資料表要存放的資料不會超過 3 萬筆,用 small integer 即可,不必用 integer。

• 文字資料欄位若長度固定,如:身分證字號,就不要用 varchar 或 nvarchar,應該用 char 或 nchar。

• 文字資料欄位若長度不固定,如:地址,則應該用 varchar 或 nvarchar。除了可節省儲存空間外,存取磁碟時也會較有效率。

• 設計欄位時,若其值可有可無,最好也給一個預設值,並設成「不允許 NULL」(一般欄位預設為「允許 NULL」)。因為 SQL Server 在存放和查詢有 NULL 的資料表時,會花費額外的運算動作 [2]。

• 若一個資料表的欄位過多,應垂直切割成兩個以上的資料表,並用同名的 Primary Key 一對多連結起來,如:Northwind 的 Orders、Order Details 資料表。以避免在存取資料時,以叢集索引掃描時會載入過多的資料,或修改資料時造成互相鎖定或鎖定過久。

—————————— 閱讀全文

Post to Twitter Post to Plurk Post to Facebook Send Gmail

MYSQL 密碼加密(透過PHP)

最近我的第一個自製PHP網站 被攻打下來了阿….

雖然不太清楚原因

 

所以最近找了個方法 把MYSQL 中所有的密碼通通加密了,這樣應該會安全些

 

參考資料

http://www.hkcode.com/programming/242

http://result945.pixnet.net/blog/post/27077947-mysql-密碼使用md5加密

 

加密方法是 透過 md5() 這個語法來完成,剛剛測試,上面兩種方法加密結果是相同的

 

我使用的方法是

在密碼 $passwd 放入SQL 之前 寫下

$passwd=md5($passwd);

 

如果 資料庫原先是明碼存的,可以透過 update `XXX` SET `passwd`=md5(passwd) where 1 來解決

不過在轉碼之前請先備份,還有確保密碼長度 超過32字元

 

 

Post to Twitter Post to Plurk Post to Facebook Send Gmail

Copyright © 2024. All Rights Reserved.

歡迎光臨
初音