強大的資料庫熱備份軟體 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
mariaDB+galera 的ㄧ些優缺點
我們公司網站www.funtime.com.tw 已經使用mariaDB+galera 的DB cluseter 系統已經一段時間了
我們是使用兩台DB 的同步運作模式
這套同步系統的最大好處是她的同步運作效率很高,相同的資料量用檔案匯入要4小時’ 但SST 同不只需2小時
先來介紹一下galera的運作原理
galera 是在收到query時先作分析,如果是單純select 就會直接回應給對方,如果是insert這類會更改DB的指令,就會同不丟給每個cluster上的DB
另外galera有一個快取機制,儲存最新更新的資料,如果當某個DB故障重啟時,她會使用其他DB的ˊ快取來回復,這稱作IST 她速度很快
另外還有一個機制叫做SST,這是當 DB掛點帶久超出快取容許範圍,就會作整個DB的重新同步,這時間就會比IST久很多
SST有一個恐怖缺限,就是在同步時,會把另一台DB鎖死,當然為了同步這樣做合理,但碰到我們公司這樣只有兩台DB的情況下就麻煩了
ㄧ台掛了兩台都不能用………
當然官方建議的方案是 開三台………..
好吧 這套系統的缺陷就在這了,對於需求不上不下的網站來說這有點浪費
MYSQL 轉mariaDB+galera的兩三事
前幾個月我們公司的網站的資料庫系統從MYSQL 5.1.3轉移到mairaDB ,其中最大的目的就是使用galera 同步技術,這當中碰到一些狀況…..
這一篇 主要就是說明一些我所知道的事,至於怎麼安裝的,請自己google吧…..
一開始我要說的是”MYSQL 轉 mariaDB 不保證完全相容….”,沒錯就是不完全相容,架設你的網站用的SQL 有點複雜,強烈建議先去測試一下,個人猜測是這樣的,mariaDB 只保證 從他所說的MYSQL版本移植過去是相容的,其他版本號不保證,另外因為mariaDB有些加速的手法會導致部分語法失靈,個人目前碰到兩種狀況 閱讀全文
網站平移備份
最近在做網站的測試,所以開了 台測試server,要把網站的資料複製到測試server
本來我都是 先把MYSQL 匯出、FTP 下載所有檔案
最近我學到新的快速方法
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 中,不過要特別注意 如果資料庫太大 超過連線時間 會直接炸開喔
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也一樣
提升資料庫 (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 資料表。以避免在存取資料時,以叢集索引掃描時會載入過多的資料,或修改資料時造成互相鎖定或鎖定過久。
—————————— 閱讀全文
解決 wp-postview 計數失敗的問題
這個問題主要是因為 修改過 wordpress 核心所產生的…..
目前WP-postview 有兩種計數模式,一種是 透過PHP的方式 計數,另一種則是為了解決 快取功能 的ajax的技術方式。
這次碰到的問題就主要是ajax的問題。
發生原因:
在wp-postview外掛中,主要的code都在wp-postview.php當中,其中要wordpress 載入ajax指令的是下面這支function
function wp_postview_cache_count_enqueue()
的下面兩行指令(我有些參數修改了…)
wp_enqueue_script( ‘wp-postviews-cache’, $tempJS, array( ‘jquery’ ), ‘1.68’ , true );
wp_localize_script( ‘wp-postviews-cache’, ‘viewsCacheL10n’, array( ‘admin_ajax_url’ => $tempJS2, ‘post_id’ => intval( $post->ID ) ) );
先簡單說明一下,這兩行的API都是 wordpress的載入js的指令,在執行過後會通知wordrpress 在載入頁面的時候載把js引入到網頁中,這中常在wp_header();或是wp_footer();中執行,所以theme中的這兩行指令絕對不要拿掉….
OK經過測試,上面這兩行指令有正常執行,經過測試主要是因為wordpress的jquery 載入設定被改掉了…
剛剛我說,wordpress 會依照你的要求 引入你要的JS,但是在這之前他會要你先寫下你的js有需要那些前置JS,而我們所需要的jquery雖然有載入,但是不是用wordpress 官方的載入方式,導致wordpress 以為缺少前置JS 而不予載入
解決方法,在下列檔案中
\wp-includes\script-loader.php
有下列三行code,請確定他都有在跑…..
// jQuery
$scripts->add( ‘jquery’, false, array( ‘jquery-core’, ‘jquery-migrate’ ), ‘1.10.2’ );
$scripts->add( ‘jquery-core’, ‘/wp-includes/js/jquery/jquery.js’, array(), ‘1.10.2’ );
$scripts->add( ‘jquery-migrate’, “/wp-includes/js/jquery/jquery-migrate$suffix.js”, array(), ‘1.2.1’ );
就是這樣….
參考資料
http://yusi123.com/3086.html
http://codex.wordpress.org/Function_Reference
檢查圖片連結失效
有些時候會有照片失效的狀況,為了避免出現 叉叉 的難看畫面,有下列方法解決
以下三種方法 都可以在圖片時效的情況下 替換另一張預設照片
1. HTML 法
在<img> 中增加 onError=”this.src=’XXXimg.jpg’ ”
2.jquery法
$('img').attr('onError','this.src="XXXimg.jpg"'); 3.jquery終極處理方法
$('img').error(function(){ $(this).attr('src', 'XXXimg.gif'); $(this).attr('width', '1px'); $(this).attr('height', '1px'); })
PHP 所有$_SERVER的可用參數表
引用自 http://www.w3schools.com/php/php_superglobals.asp
下表列出了可以去裡面$ _SERVER中最重要的元素:
Element/Code | Description |
---|---|
$_SERVER[‘PHP_SELF’] | Returns the filename of the currently executing script |
$_SERVER[‘GATEWAY_INTERFACE’] | Returns the version of the Common Gateway Interface (CGI) the server is using |
$_SERVER[‘SERVER_ADDR’] | Returns the IP address of the host server |
$_SERVER[‘SERVER_NAME’] | Returns the name of the host server (such as www.w3schools.com) |
$_SERVER[‘SERVER_SOFTWARE’] | Returns the server identification string (such as Apache/2.2.24) |
$_SERVER[‘SERVER_PROTOCOL’] | Returns the name and revision of the information protocol (such as HTTP/1.1) |
$_SERVER[‘REQUEST_METHOD’] | Returns the request method used to access the page (such as POST) |
$_SERVER[‘REQUEST_TIME’] | Returns the timestamp of the start of the request (such as 1377687496) |
$_SERVER[‘QUERY_STRING’] | Returns the query string if the page is accessed via a query string |
$_SERVER[‘HTTP_ACCEPT’] | Returns the Accept header from the current request |
$_SERVER[‘HTTP_ACCEPT_CHARSET’] | Returns the Accept_Charset header from the current request (such as utf-8,ISO-8859-1) |
$_SERVER[‘HTTP_HOST’] | Returns the Host header from the current request |
$_SERVER[‘HTTP_REFERER’] | Returns the complete URL of the current page (not reliable because not all user-agents support it) |
$_SERVER[‘HTTPS’] | Is the script queried through a secure HTTP protocol |
$_SERVER[‘REMOTE_ADDR’] | Returns the IP address from where the user is viewing the current page |
$_SERVER[‘REMOTE_HOST’] | Returns the Host name from where the user is viewing the current page |
$_SERVER[‘REMOTE_PORT’] | Returns the port being used on the user’s machine to communicate with the web server |
$_SERVER[‘SCRIPT_FILENAME’] | Returns the absolute pathname of the currently executing script |
$_SERVER[‘SERVER_ADMIN’] | Returns the value given to the SERVER_ADMIN directive in the web server configuration file (if your script runs on a virtual host, it will be the value defined for that virtual host) (such as someone@w3schools.com) |
$_SERVER[‘SERVER_PORT’] | Returns the port on the server machine being used by the web server for communication (such as 80) |
$_SERVER[‘SERVER_SIGNATURE’] | Returns the server version and virtual host name which are added to server-generated pages |
$_SERVER[‘PATH_TRANSLATED’] | Returns the file system based path to the current script |
$_SERVER[‘SCRIPT_NAME’] | Returns the path of the current script |
$_SERVER[‘SCRIPT_URI’] | Returns the URI of the current page |