顯示具有 MySQL 標籤的文章。 顯示所有文章
顯示具有 MySQL 標籤的文章。 顯示所有文章

2011年8月22日 星期一

MySQL 升級

(PS:此文章從Web上的PDF檔案中擷取出來的)
如果你有安裝MySQL
而且MySQL 版本是5.X 的,請注意囉
因為從MySQL 4.1 開始,密碼格式很像變得不同囉
詳情請看此篇:http://dev.mysql.com/doc/refman/4.1/en/old-client.html
MySQL 4.1 and up uses an authentication protocol based on a password hashing algorithm that is
incompatible with that used by older clients. If you upgrade the server to 4.1, attempts to connect to
it with an older client may fail with the following message:
shell> mysql
Client does not support authentication protocol requested
by server; consider upgrading MySQL client
簡單的   , 說 MySQL 4.1跟更新的版本使用一個以密碼雜湊演算法為基礎的驗證協定
而且跟舊版的不一樣,不適用於舊版的 Client端.
如果你的 MySQL升級到 4.1(或者更新的,像是 5.X)
你連線到 MySQL時應該會出現以下訊息(請往上看 XD)
解決方法很多
•    升級Client 端的MySQL 函式庫
•    連線到4.1 以上版本的MySQL 時,使用4.1 以上版本的帳號密碼來進行連線
•    啟動MySQL 時,多加個--old-passwords 引數
•    登入MySQL,使用old_password 函式(待會說明)
OK,我們先來學第四個方法吧.. 也是我最習慣使用的方法(因為簡單拉@@")
請你先登入mysql(請用有權限更改mysql 的帳戶,例如:root)
然後↓
mysql> set password for '帳號'@'主機' = old_password('密碼');
Query OK, 0 rows affected (0.00 sec)
用好之後,請update 跟flush privileges
mysql> update mysql.user set password = old_password('密碼') where host = '主機' and user = '帳
號';
Query OK, 0 rows affected (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
OK,這樣一來就更改好了!可以連線看看囉!
另外一種方法,也就是第三種方法可以自行參考MySQL 函式庫說明囉^^

2011年3月30日 星期三

MySQL 紀錄 SQL 語法

MySQL大約有3種方法, 加入 /etc/my.cnf後, 再 service mysqld restart !!

1. 查詢 Slow query 的 SQL 語法:
log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 2 (超過 2秒的 SQL 語法記錄起來)

2. 設 MySQL Replication 用 binlog:
log_bin = /var/log/mysql/mysql-bin.log (此檔要用 mysqlbinlog 解來看)
mysql 會將所有 INSERT/UPDATE/DELETE 語法記於此(但是語法可能跟你想的不同), 這是要寫給 SLAVE 用的 log 檔

3. 將 MySQL 執行的每行指令全都記錄起來(作者推薦):
log = /tmp/mysql.log
restart mysql 後, tail -f /tmp/mysql.log 就可以看到囉!

參考網址:
http://blog.longwin.com.tw/2007/06/mysql_record_any_sql_command_2007/

MySQL 資料表格式 InnoDB 與 MyISAM 的比較

MyISAM :
1.效能優,預設引擎,為 Mysql最早使用的引擎
2.使用MyISAM將具備三種 檔案:.frm (table format) .MYD(data file) .MYI(index file)
3.所有資料是以low byte first儲存,數字型key是以high byte first儲存以利索引
4.支援大檔 ( > 63 bit)
5.支援42億(2^32次方) 資料筆數,如果MySQL編譯有加入--with-big-tables 選項可支援多一倍(2^32次方 * 2)資料量
6.不支援事務處理,例如關聯式 資料庫
7.AUTO_INCREMENT 更快(至少10%),序列的值被刪除之後就不能再利用

InnoDB:
1.具備Commit, Rollback和當掉復原的事務處理能力,可保護使用者資料
2.可進行row-level的 鎖定同時維持nonlocking reads,以支援多人同時連線狀態
3.可支援FOREIGN KEY
4.InnoDB是專門為了大容 量資料的最大效率進行設計的,CPU效能是其他的disk-based資料庫引擎所不及的
5.InnoDB儲存他的表和 index在一個表空間中,此表空間可能包含幾個檔(有可能在不同disk partitions),此點和MyISAM不同,MyISAM是一個表一個檔案,這差一點造成InnoDB表個可以非常大,即使是超過系統的file size(例如2GB)都可處理
6.此為Windows安裝檔的 默認值
7.InnoDB上可處理存儲超 過1TB的數據,可支援例如平均每秒800次插入/更新的負荷
8.支援關聯資料庫

InnoDB使用上的限制:
1.不要將MyISAM轉成InnoDB table
2.不要在NFS格式上將 InnoDB設定成data files或log file,檔案容易被鎖住
3.一個表不能包含超過1000 欄
4.內部key最大長度為 3500 bytes,MySQL限制為3072 Bytes
5.每筆資料最長約為8000 Bytes,變長的欄位(例如Varchar/BLOB/TEXT)需小於4000 Bytes.
6.即使InnoDB支援row size大於65535,也不能定義一個包含VARBINARY/VARCHAR的欄位總合大於65535 (會出現錯誤訊息)
7.在依些舊系統中,檔案需小於 2GB,這並不限制InnoDB的使用,但你如果需要大的tablespace則需額外進行設定
8.InnoDB的log file總共大小需小於4GB
9.最小的tablespace 大小為10MB,最大的大小為64TB,這也是table的最大值
10.不支援FULLTEXT
11.InnoDB不保留每個表 個的總數統計,也就是count(*)則必須進行index計算
12.在InnoDB 中,AUTO_INCREMENT欄位如果存在,則"必須"定義一個index欄位包含AUTO_INCREMENT欄;在MyISAM 中,AUTO_INCREMENT欄位"可能"為index中的一欄
13.DELETE FROM Table為逐筆資料刪除,非整個table刪除
14.在InnoDB 中,TRUNCATE Table

Memory(相同於HEAP):
1.將所有數據保存在RAM中, 可提供極快的訪問,但如果關機資料就會消失無法儲存
2.每一個MEMORY Table關聯一個Disk file(.frm)
3.常使用在 create temporary table上,連線結束後就釋放空間
4.預設使用hash indexes(速度非常快且對於建立臨時表格非常有效)
5.MEMORY不支持BLOB 或TEXT列
6.MEMORY使用定長的儲存 格式列
7.可支援 AUTO_INCREMENT

項目 MyIASM InnoDB Memory
空間限制 無 64TB 記憶體
transaction x 有 x
大量 Insert 速度 高 低 高
設置外來鍵 x 有 x
鎖定層級 資料表 資料列 資料表
二元樹索引 有 有 不知
雜湊索引 x 有 有
全文搜尋索引 有 x x
資料壓縮 有 x x
資料快取 x 有 有
索引快取 有 有 有
記憶體佔用 低 高 中
磁碟佔用 低 高 x

參考連結:
http://miggo.pixnet.net/blog/post/30855147
http://blog.roga.tw/2008/11/mysql-資料庫儲存引擎的選用/

2011年3月28日 星期一

DRBD & Heartbeat & mysql

參考網址:
http://wiselysong.blogspot.com/2009/01/heartbeatdrbdmysql-on-debian-etch.html
目前這種機制, 最好安裝在 CentOS 上面.
DRBD: 分散式儲存系統(在 Master 和 Slave 的機器上, 會有兩個一樣大的空間, 存在著相同的資料)
Heartbeat: 產生 Virtual ip, 監測 mysql 的狀態, 如果 Master 掛了, 沒辦法連線, 將會把 Master Mysql Stop 後, umount DRBD, DRBD再連到 Slave, Slave mount DRBD, Slave Mysql Start.
在CentOS 上面, 可以用以下語法觀看目前的狀況:
1. service mysqld status
2. service drbd status
3. service heartbeat status
如果要停止. 可以下以下語法:
1. service mysqld stop
2. service drbd stop
3. service heartbeat stop

2010年9月21日 星期二

使用 MinGW 編譯 C++ 紀錄

1. windres Lession5.rc Lession5.o
2. g++ -o Lession5.exe Lession5.c Lession5.o
3. g++ -o sample01 sample01.cpp -mwindows (-mwindows 是在windows下執行exe檔案時,不會在跳出一個Console的視窗)

// g++ dos(使用 Notepad++ NppExec 套件的紀錄)
C:\MinGW\bin\g++.exe "$(FULL_CURRENT_PATH)" -o $(NAME_PART)

// g++(使用 Notepad++ NppExec 套件的紀錄)
C:\MinGW\bin\g++.exe "$(FULL_CURRENT_PATH)" -o $(NAME_PART) -mwindows -Wall( -Wall 會顯示程式中是否有無效的參數或函式)

// g++ & rc & comctl32(使用 Notepad++ NppExec 套件的紀錄, 使用Window控制項)
C:\MinGW\bin\windres.exe $(NAME_PART).rc -o $(NAME_PART).o
C:\MinGW\bin\g++.exe "$(FULL_CURRENT_PATH)" -o $(NAME_PART) $(NAME_PART).o "C:\Program Files\Microsoft SDKs\Windows\v7.0A\Lib\comctl32.lib" -mwindows -Wall

// g++ & rc(使用 Notepad++ NppExec 套件的紀錄)
C:\MinGW\bin\windres.exe $(NAME_PART).rc -o $(NAME_PART).o
C:\MinGW\bin\g++.exe "$(FULL_CURRENT_PATH)" -o $(NAME_PART) $(NAME_PART).o -mwindows -Wall

// g++ & lib(使用 Notepad++ NppExec 套件的紀錄, 使用Windows Timer套件)
C:\MinGW\bin\g++.exe "$(FULL_CURRENT_PATH)" -o $(NAME_PART) "C:\Program Files\Microsoft SDKs\Windows\v7.0A\Lib\WinMM.Lib" -mwindows

// C++ 連結 MySQL 的方法(不使用 Visual C++ 和 .net 的方式)
01. 需要上網抓取 mysql-connector-c-noinstall-6.0.2-win32
02. 參考 http://www.programmer-club.com/showSameTitleN/mysql/911.html
03. 參考 http://www.openwebspider.org/documentation/how-to-link-libmysqllib-with-dev-c-or-gcc-under-windows/
04. 產生 libmysql.a 的方式
> reimp.exe <FULL_PATH_OF(MySQL\lib\opt)>libmysql.lib
(^ This command creates: libmysql.def AND libmysql.a)
> dlltool.exe –input-def LIBMYSQL.def –dllname libmysql.dll –output-lib libmysql.dll
(^ this creates libmysql.dll)
05. 將產生的 libmysql.a 拷貝到 MinGW 的 lib 下
06. 在程式中, 需要 include 兩個檔案
#include <winsock.h> // SOCKET TYPE(for mysql.h)
#include <mysql.h>
07. 可以使用以下程式測試連結是否成功??
using namespace std;
int main(void) {
MYSQL my_connection; //This is a SQL connection.
mysql_init(&my_connection); //initinal mysql connection

if (mysql_real_connect(&my_connection, HOST, USERNAME, PASSWORD, DATABASE, 0, NULL, CLIENT_FOUND_ROWS)) { //connect success
cout << "Connection Success!!\r\n";
mysql_close(&my_connection); //close database connection
} else {
cout << "Connection Fail!!\r\n";
}
getch();
return EXIT_SUCCESS;
}

08. 編譯檔案的時候, 需要在後面加上 -lmysql -lws2_32, 如下:(使用 Notepad++ NppExec 套件的紀錄)
C:\MinGW\bin\g++.exe "$(FULL_CURRENT_PATH)" -o $(NAME_PART) -I "C:\mysql_c\include" -lmysql -lws2_32
例如: C:\MinGW\bin\g++.exe "C:\portable\C++\WinApp\mysqlconn.cpp" -o mysqlconn -I "C:\mysql_c\include" -lmysql -lws2_32 -mwindows

2010年7月2日 星期五

MySQL Error log

設定可以觀看 mysql 的 error log 檔案  
mkdir /var/log/mysql
chown mysql:mysql /var/log/mysql
chmod 750 /var/log/mysql
The best choice is to define the error log, in both the [mysqld_safe]  and [mysqld] section of your servers my.cnf
[mysqld_safe]
     log-error=/var/log/mysql/error.log
[mysqld]
     log-error=/var/log/mysql/error.log

轉貼自:http://ronaldbradford.com/blog/monitoring-mysql-the-error-log-2009-09-16/

2010年2月4日 星期四

python 連結 MySQL 顯示 UTF-8 中文

最近在研究 python 串聯 mysql 的方式, 之前一直抓 MySQL-python-1.2.3c1.tar.gz
回來安裝, 都安裝不起來,結果同事告知要去抓取 windows 下 可以執行的檔案, 所以去抓了
MySQL-python-1.2.2.win32-py2.5.exe 回來安裝後, python 就可以與 mysql 連結了.

可以連結後,想說要顯示mysql 內的utf-8字元,找了很久,找不到,後來找到要在connect中加入utf-8的參數設定,
如下:
db = MySQLdb.connect(user='username', db='mydbname', passwd='userpassword', host='127.0.0.1', charset='utf8')

之後可以顯示utf-8的字元了, 但是卻顯示 (u'\u4efb\u7ea2') 這樣的字,結果查詢後是因為顯示rows的資料才這樣,將 print row 改成 print row[0] 就可以了.
之後可以顯示後,又發現沒辦法顯示utf-8的中文簡體字,所以又找了一下,要將 print row[0] 改成
print row[0].encode('utf8') 才可以. 所以,這是要讓它顯示 utf-8 中文的過程

PS: 使用 python 2.5.4, mysql 5.1

測試程式如下:

#encoding=utf8
#-*- coding: utf-8 -*-
import MySQLdb
db = MySQLdb.connect(user='xxx', db='MyDb', passwd='pwd', host='127.0.0.1', charset='utf8')
cursor = db.cursor()
#cursor.execute('set names utf8;')
#cursor.execute('set character set utf8;')
#cursor.execute('set character_set_connection=utf8;')
cursor.execute('SELECT u_name as name FROM user ORDER BY user_id')
#names = [unicode(row[0]) for row in cursor.fetchall()]
#print names
results = cursor.fetchall()
for row in results:
x = row[0]
#print "%s" % unicode(x)
print x.encode('utf8')
db.close()

2010年1月8日 星期五

觀看 MySQL 之前 configure 的參數

執行 /bin/mysqlbug
觀看最後一行, 即為 之前安裝時, configure 的參數 !

MySQL Configure 參設設定

以下為參考其他人使用的MySQL configure 參數設定:

#!/bin/bash
./configure --prefix=/usr/local/mysql --mandir=/usr/local/mysql/man --infodir=/usr/local/mysql/info --with-libwrap --with-low-memory --with-mysqlfs --with-plugins=max-no-ndb --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static --enable-assenbler --with-charset=big5 --with-extra-charsets=all --with-debug=disable --enable-thread-safe-client --with-big-tables

MySQL 在 FreeBSD 上安裝的步驟

MySQL 在 FreeBSD 上安裝的步驟: (使用 Configure 方式安裝) :

1. Download mysql-5.0.16.tar.gz
2. 建立 mysql 的群組及帳號 (使用 adduser 新增比較方便)
3. 先建立要安裝的mysql 資料庫位置:/usr/local/mysql 設定群組權限為mysql
4. su mysql
5. tar xzvf mysql-5.0.16.tar.gz
6. 先將 configure 的參設設定為一個檔案, 例如 mysql.configure.sh 在執行 /bin/sh /mysql.configure.sh ,將mysql configure,
(PS: 如果沒有設定成一個.sh檔案, 怕以後要修改或要查詢參數時無法查詢)
7. make install clean
8. 找到解壓縮檔案下的 /scripts/mysql_install_db , 將它執行 ./scripts/mysql_install_db
9. 這樣就已經安裝完畢

要如何測試MySQL呢?

1. 執行 /usr/local/mysqld_safe & , 看看是否可以啟動?
2. 啟動後打入 /usr/local/mysql/bin/mysqladmin version (檢查MySQL 的版本)
3. 執行 /usr/local/mysql/bin/mysqladmin variable (檢查MySQL 的參數)
4. 執行 /usr/local/mysql/mysqlshow (顯示資料庫)
5. 執行 /usr/local/mysql/bin/mysqladmin -u root -p shutdown (將MySQL 停止)

如何設定剛剛安裝好MySQL 的 root 密碼?
1. /usr/local/mysql/bin/mysqladmin -u root password xxxxx (xxxxx 就是你要輸入的密碼)

如何新增設定MySQL 的使用者?
1. /usr/local/mysql/bin/mysql -u root -p xxxxx
2. grant all privileges on *.* to 'xxx'@'%' identified by 'xxxxxx'; (xxx為使用者名稱 ; xxxxxx為使用者密碼 )
3. flush privileges;

MySQL 權限的修改 :
1. update user set password=password('xxxxx') where Db=xxxxx and User=yyyyy;
2. 改完後一定要執行: flush privileges;

如果出現 Can't connect to local MySQL Server through socket 'tmp/mysql.sock' .
1, ln -s /var/lib/mysql.sock /tmp/mysql.sock

MySQL 建立索引的方法

1. MySQL建立索引
Ans: CREATE INDEX mytable_categoryid ON mytable (category_id);
CREATE INDEX mytable_categoryid_userid ON mytable (category_id,user_id);

2. MySQL 要看搜尋是否有跑索引
Ans: 使用 Explain 命令

3. MySQL 看執行緒命令
Ans: mysqladmin -u bill -p processlist
或是安裝MyTOP