超碰97在线免费,欧美二区在线观看,欧美性猛交xxxx免费看久久久 http://www.aygfsteel.com/wangxinsh55/category/49905.htmlzh-cnSat, 02 Jul 2016 00:55:14 GMTSat, 02 Jul 2016 00:55:14 GMT60MySQL分庫分表的全局唯一ID生成器方案http://www.aygfsteel.com/wangxinsh55/archive/2016/06/28/431035.htmlSIMONESIMONETue, 28 Jun 2016 10:48:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2016/06/28/431035.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/431035.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2016/06/28/431035.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/431035.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/431035.htmlhttp://lztian.com/blog/5921.html

借用MySQL 的 auto_increment 特性可以產(chǎn)生唯一的可靠ID。

表定義,關(guān)鍵在于auto_increment,和UNIQUE KEY的設(shè)置:

1
2
3
4
5
6
CREATE TABLE `Tickets64` (
  `id` bigint(20) unsigned NOT NULL auto_increment,
  `stub` char(1) NOT NULL default '',
  PRIMARY KEY  (`id`),
  UNIQUE KEY `stub` (`stub`)
) ENGINE=MyISAM

需要使用時(shí),巧用replace into語法來獲取值,結(jié)合表定義的UNIQUE KEY,確保了一條記錄就可以滿足ID生成器的需求:

1
2
REPLACE INTO Tickets64 (stub) VALUES ('a');
SELECT LAST_INSERT_ID();

以上方式中,通過MySQL的機(jī)制,可以確保此ID的唯一和自增,且適用于多并發(fā)的場景。官方對此的描述:https://dev.mysql.com/doc/refman/5.0/en/information-functions.html

1
2
3
It is multi-user safe because multiple clients can issue the UPDATE statement and
get their own sequence value with the SELECT statement (or mysql_insert_id()),
without affecting or being affected by other clients that generate their own sequence values.

需要注意的是,若client采用PHP,則不能使用mysql_insert_id()獲取ID,原因見《mysql_insert_id() 在bigint型AI字段遇到的問題》:http://kaifage.com/notes/99/mysql-insert-id-issue- with-bigint-ai-field.html。

Flickr 采取了此方案: http://code.flickr.net/2010/02/08/ticket-servers-distributed-unique-primary-keys-on-the-cheap/

相關(guān):

http://www.zhihu.com/question/30674667

http://my.oschina.net/u/142836/blog/174465



SIMONE 2016-06-28 18:48 發(fā)表評論
]]>
MYSQL之表分區(qū)----按日期分區(qū) http://www.aygfsteel.com/wangxinsh55/archive/2016/06/07/430822.htmlSIMONESIMONETue, 07 Jun 2016 10:06:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2016/06/07/430822.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/430822.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2016/06/07/430822.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/430822.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/430822.htmlhttp://blog.sina.com.cn/s/blog_888269b20100w7kf.html

mysql 5.1已經(jīng)到了beta版,官方網(wǎng)站上也陸續(xù)有一些文章介紹,比如上次看到的Improving Database Performance with Partitioning。在使用分區(qū)的前提下,可以用mysql實(shí)現(xiàn)非常大的數(shù)據(jù)量存儲。今天在mysql的站上又看到一篇進(jìn)階的文章 —— 按日期分區(qū)存儲。如果能夠?qū)崿F(xiàn)按日期分區(qū),這對某些時(shí)效性很強(qiáng)的數(shù)據(jù)存儲是相當(dāng)實(shí)用的功能。下面是從這篇文章中摘錄的一些內(nèi)容。

錯(cuò)誤的按日期分區(qū)例子

最直觀的方法,就是直接用年月日這種日期格式來進(jìn)行常規(guī)的分區(qū):

CODE:
  1. mysql>  create table rms (d date)
  2.     ->  partition by range (d)
  3.     -> (partition p0 values less than ('1995-01-01'),
  4.     ->  partition p1 VALUES LESS THAN ('2010-01-01'));

 

上面的例子中,就是直接用"Y-m-d"的格式來對一個(gè)table進(jìn)行分區(qū),可惜想當(dāng)然往往不能奏效,會得到一個(gè)錯(cuò)誤信息:

ERROR 1064 (42000): VALUES value must be of same type as partition function near '),
partition p1 VALUES LESS THAN ('2010-01-01'))' at line 3

上述分區(qū)方式?jīng)]有成功,而且明顯的不經(jīng)濟(jì),老練的DBA會用整型數(shù)值來進(jìn)行分區(qū):

CODE:
  1. mysql> CREATE TABLE part_date1
  2.     ->      (  c1 int default NULL,
  3.     ->  c2 varchar(30) default NULL,
  4.     ->  c3 date default NULL) engine=myisam
  5.     ->      partition by range (cast(date_format(c3,'%Y%m%d') as signed))
  6.     -> (PARTITION p0 VALUES LESS THAN (19950101),
  7.     -> PARTITION p1 VALUES LESS THAN (19960101) ,
  8.     -> PARTITION p2 VALUES LESS THAN (19970101) ,
  9.     -> PARTITION p3 VALUES LESS THAN (19980101) ,
  10.     -> PARTITION p4 VALUES LESS THAN (19990101) ,
  11.     -> PARTITION p5 VALUES LESS THAN (20000101) ,
  12.     -> PARTITION p6 VALUES LESS THAN (20010101) ,
  13.     -> PARTITION p7 VALUES LESS THAN (20020101) ,
  14.     -> PARTITION p8 VALUES LESS THAN (20030101) ,
  15.     -> PARTITION p9 VALUES LESS THAN (20040101) ,
  16.     -> PARTITION p10 VALUES LESS THAN (20100101),
  17.     -> PARTITION p11 VALUES LESS THAN MAXVALUE );
  18. Query OK, 0 rows affected (0.01 sec)

 

搞定?接著往下分析

CODE:
  1. mysql> explain partitions
  2.     -> select count(*) from part_date1 where
  3.     ->      c3> date '1995-01-01' and c3 <date '1995-12-31'\G
  4. *************************** 1. row ***************************
  5.            id: 1
  6.   select_type: SIMPLE
  7.         table: part_date1
  8.    partitions: p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11
  9.          type: ALL
  10. possible_keys: NULL
  11.           key: NULL
  12.       key_len: NULL
  13.           ref: NULL
  14.          rows: 8100000
  15.         Extra: Using where
  16. 1 row in set (0.00 sec)

 

萬惡的mysql居然對上面的sql使用全表掃描,而不是按照我們的日期分區(qū)分塊查詢。原文中解釋到MYSQL的優(yōu)化器并不認(rèn)這種日期形式的分區(qū),花了大量的篇幅來引誘俺走上歧路,過分。

正確的日期分區(qū)例子

mysql優(yōu)化器支持以下兩種內(nèi)置的日期函數(shù)進(jìn)行分區(qū):

  • TO_DAYS()
  • YEAR()

看個(gè)例子:

CODE:
  1. mysql> CREATE TABLE part_date3
  2.     ->      (  c1 int default NULL,
  3.     ->  c2 varchar(30) default NULL,
  4.     ->  c3 date default NULL) engine=myisam
  5.     ->      partition by range (to_days(c3))
  6.     -> (PARTITION p0 VALUES LESS THAN (to_days('1995-01-01')),
  7.     -> PARTITION p1 VALUES LESS THAN (to_days('1996-01-01')) ,
  8.     -> PARTITION p2 VALUES LESS THAN (to_days('1997-01-01')) ,
  9.     -> PARTITION p3 VALUES LESS THAN (to_days('1998-01-01')) ,
  10.     -> PARTITION p4 VALUES LESS THAN (to_days('1999-01-01')) ,
  11.     -> PARTITION p5 VALUES LESS THAN (to_days('2000-01-01')) ,
  12.     -> PARTITION p6 VALUES LESS THAN (to_days('2001-01-01')) ,
  13.     -> PARTITION p7 VALUES LESS THAN (to_days('2002-01-01')) ,
  14.     -> PARTITION p8 VALUES LESS THAN (to_days('2003-01-01')) ,
  15.     -> PARTITION p9 VALUES LESS THAN (to_days('2004-01-01')) ,
  16.     -> PARTITION p10 VALUES LESS THAN (to_days('2010-01-01')),
  17.     -> PARTITION p11 VALUES LESS THAN MAXVALUE );
  18. Query OK, 0 rows affected (0.00 sec)

 

以to_days()函數(shù)分區(qū)成功,我們分析一下看看:

CODE:
  1. mysql> explain partitions
  2.     -> select count(*) from part_date3 where
  3.     ->      c3> date '1995-01-01' and c3 <date '1995-12-31'\G
  4. *************************** 1. row ***************************
  5.            id: 1
  6.   select_type: SIMPLE
  7.         table: part_date3
  8.    partitions: p1
  9.          type: ALL
  10. possible_keys: NULL
  11.           key: NULL
  12.       key_len: NULL
  13.           ref: NULL
  14.          rows: 808431
  15.         Extra: Using where
  16. 1 row in set (0.00 sec)

 

可以看到,mysql優(yōu)化器這次不負(fù)眾望,僅僅在p1分區(qū)進(jìn)行查詢。在這種情況下查詢,真的能夠帶來提升查詢效率么?下面分別對這次建立的part_date3和之前分區(qū)失敗的part_date1做一個(gè)查詢對比:

CODE:
  1. mysql> select count(*) from part_date3 where
  2.     ->      c3> date '1995-01-01' and c3 <date '1995-12-31';
  3. +----------+
  4. | count(*) |
  5. +----------+
  6.  805114 |
  7. +----------+
  8. 1 row in set (4.11 sec)
  9.  
  10. mysql> select count(*) from part_date1 where
  11.     ->      c3> date '1995-01-01' and c3 <date '1995-12-31';
  12. +----------+
  13. | count(*) |
  14. +----------+
  15.  805114 |
  16. +----------+
  17. 1 row in set (40.33 sec)

 

可以看到,分區(qū)正確的話query花費(fèi)時(shí)間為4秒,而分區(qū)錯(cuò)誤則花費(fèi)時(shí)間40秒(相當(dāng)于沒有分區(qū)),效率有90%的提升!所以我們千萬要正確的使用分區(qū)功能,分區(qū)后務(wù)必用explain驗(yàn)證,這樣才能獲得真正的性能提升。


注意:

在mysql5.1中建立分區(qū)表的語句中,只能包含下列函數(shù):
ABS()
CEILING() and FLOOR() (在使用這2個(gè)函數(shù)的建立分區(qū)表的前提是使用函數(shù)的分區(qū)鍵是INT類型),例如

mysql> CREATE TABLE t (c FLOAT) PARTITION BY LIST( FLOOR(c) )(     -> PARTITION p0 VALUES IN (1,3,5),     -> PARTITION p1 VALUES IN (2,4,6)     -> );; ERROR 1491 (HY000): The PARTITION function returns the wrong type   mysql> CREATE TABLE t (c int) PARTITION BY LIST( FLOOR(c) )(     -> PARTITION p0 VALUES IN (1,3,5),     -> PARTITION p1 VALUES IN (2,4,6)     -> ); Query OK, 0 rows affected (0.01 sec) 

DAY()
DAYOFMONTH()
DAYOFWEEK()
DAYOFYEAR()
DATEDIFF()
EXTRACT()
HOUR()
MICROSECOND()
MINUTE()
MOD()
MONTH()
QUARTER()
SECOND()
TIME_TO_SEC()
TO_DAYS()
WEEKDAY()
YEAR()
YEARWEEK()



SIMONE 2016-06-07 18:06 發(fā)表評論
]]>
【MYSQL數(shù)據(jù)庫】MYSQL學(xué)習(xí)筆記-mysql分區(qū)基本操作http://www.aygfsteel.com/wangxinsh55/archive/2013/02/22/395592.htmlSIMONESIMONEFri, 22 Feb 2013 09:43:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2013/02/22/395592.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/395592.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2013/02/22/395592.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/395592.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/395592.htmlhttp://www.0773linji.com/web/mysql_partitions.html

【MySQL使用分區(qū)表的好處】
1.可以把一些歸類的數(shù)據(jù)放在一個(gè)分區(qū)中,可以減少服務(wù)器檢查數(shù)據(jù)的數(shù)量加快查詢。
2.方便維護(hù),通過刪除分區(qū)來刪除老的數(shù)據(jù)。
3.分區(qū)數(shù)據(jù)可以被分布到不同的物理位置,可以做分布式有效利用多個(gè)硬盤驅(qū)動器。

【MySQL可以建立四種分區(qū)類型的分區(qū)】
RANGE 分區(qū):基于屬于一個(gè)給定連續(xù)區(qū)間的列值,把多行分配給分區(qū)。
LIST 分區(qū):類似于按RANGE分區(qū),區(qū)別在于LIST分區(qū)是基于列值匹配一個(gè)離散值集合中的某個(gè)值來進(jìn)行選擇。
HASH分區(qū):基于用戶定義的表達(dá)式的返回值來進(jìn)行選擇的分區(qū),該表達(dá)式使用將要插入到表中的這些行的列值進(jìn)行計(jì)算。這個(gè)函數(shù)可以包含MySQL 中有效的、產(chǎn)生非負(fù)整數(shù)值的任何表達(dá)式。
KEY 分區(qū):類似于按HASH分區(qū),區(qū)別在于KEY分區(qū)只支持計(jì)算一列或多列,且MySQL 服務(wù)器提供其自身的哈希函數(shù)。必須有一列或多列包含整數(shù)值。
一般用得多的是range分區(qū)和list分區(qū)。


【查看是否支持分區(qū)】

show variables like "%part%";

【如何查看mysql分區(qū)信息】

select * from INFORMATION_SCHEMA.PARTITIONS where table_name='user'; (這里查看user表的分區(qū)信息)

【查看執(zhí)行一條查詢SQL會掃描的分區(qū)】

explain partitions select * from user where id=10;

【如何創(chuàng)建分區(qū)】
1.建表時(shí)就分區(qū):

CREATE TABLE IF NOT EXISTS `user` ( 
   `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用戶ID', 
   `name` varchar(50) NOT NULL DEFAULT '' COMMENT '名稱', 
   `sex` int(1) NOT NULL DEFAULT '0' COMMENT '0為男,1為女', 
   PRIMARY KEY (`id`) 
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 
PARTITION BY RANGE (id) ( 
     PARTITION p0 VALUES LESS THAN (3), 
     PARTITION p1 VALUES LESS THAN (6), 
     PARTITION p2 VALUES LESS THAN (9), 
     PARTITION p3 VALUES LESS THAN (12), 
     PARTITION p4 VALUES LESS THAN MAXVALUE 
);

2.對現(xiàn)有表進(jìn)行分區(qū):可以對現(xiàn)有表進(jìn)行分區(qū),并且會按規(guī)則自動的將表中的數(shù)據(jù)分配相應(yīng)的分區(qū)中

alter table 表名 partition by RANGE(字段) 
(PARTITION p1 VALUES less than (1), 
PARTITION p2 VALUES less than (5), 
PARTITION p3 VALUES less than MAXVALUE);

【刪除一個(gè)分區(qū)】
(當(dāng)刪除了一個(gè)分區(qū),也同時(shí)刪除了該分區(qū)中所有的數(shù)據(jù))
ALTER TABLE 表名 DROP PARTITION p2;

【分區(qū)合并】
下面的SQL,將p201001 - p201009 合并為3個(gè)分區(qū)p2010Q1 - p2010Q3

ALTER TABLE sale_data
    REORGANIZE PARTITION p201001,p201002,p201003,
 
    p201004,p201005,p201006,
 
    p201007,p201008,p201009 INTO
 
    (
 
    PARTITION p2010Q1 VALUES LESS THAN (201004),
 
    PARTITION p2010Q2 VALUES LESS THAN (201007),
 
    PARTITION p2010Q3 VALUES LESS THAN (201010)
 
   );

【分區(qū)的拆分】
下面的SQL,將p2010Q1 分區(qū),拆分為s2009 與s2010 兩個(gè)分區(qū)

ALTER TABLE sale_data REORGANIZE PARTITION p2010Q1 INTO (
 
   PARTITION s2009 VALUES LESS THAN (201001),
            
    PARTITION s2010 VALUES LESS THAN (201004)
 
   );

【分區(qū)索引的局限】
1.所有分區(qū)都要使用同樣的引擎。
2.分區(qū)表的每一個(gè)唯一索引必須包含由分區(qū)函數(shù)引用的列。
3.mysql能避免查詢所有的分區(qū),但仍然鎖定了所有分區(qū)。
4.分區(qū)函數(shù)能使用的函數(shù)和表達(dá)式有限,例如函數(shù)有上面的4種。
5.分區(qū)不支持外鍵。
6.不能使用LOAD INDEX INTO CACHE
7.分區(qū)并不能總是改善性能,要進(jìn)行性能評測。



SIMONE 2013-02-22 17:43 發(fā)表評論
]]>
ubuntu 11.10 下安裝mysql5.5.17 (個(gè)人安裝過程)http://www.aygfsteel.com/wangxinsh55/archive/2011/10/25/361995.htmlSIMONESIMONETue, 25 Oct 2011 06:16:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2011/10/25/361995.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/361995.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2011/10/25/361995.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/361995.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/361995.html開始我卸載是直接使用軟件中心的界面“卸載”按扭來卸載的。由于使用界面的“卸載”按鈕卸載,卸載的不干凈;在后邊的安裝過程中引起了不小的麻煩。
所以必須使用下邊的命令來完成卸載:
刪除 mysql
sudo apt-get autoremove --purge mysql-server-5.0
sudo apt-get remove mysql-server
sudo apt-get autoremove mysql-server
sudo apt-get remove mysql-common (非常重要)
上面的其實(shí)有一些是多余的,建議還是按照順序執(zhí)行一遍

清理殘留數(shù)據(jù)
dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P

上邊的操作來自http://www.aygfsteel.com/yjhmily/articles/336926.html這個(gè)站點(diǎn)

=====================================================================
清理工作完成之后,下邊開始安裝:
我參考的地址列表
http://dev.mysql.com/doc/refman/5.5/en/binary-installation.html
http://forum.ubuntu.org.cn/viewtopic.php?t=301214
http://www.cnblogs.com/wuhou/archive/2008/09/28/1301071.html

下邊的是我的操作:
groupadd mysql
useradd -r -g mysql mysql
tar zxvf /path/to/mysql-VERSION-OS.tar.gz
#將下載到的二進(jìn)制MySQL文件解壓到/opt/mysql_5_5_17目錄下,即將MySQL安裝到/opt/mysql_5_5_17目錄下。網(wǎng)上好多教程都是安裝到/usr/local/mysql目錄下,我這里做了修改
cp /path/to/mysql-VERSION-OS.tar.gz /opt/mysql_5_5_17
#將當(dāng)前目錄的所有者改為mysql用戶  要加上-R參數(shù)。這個(gè)參數(shù)表示循環(huán)遍歷子節(jié)點(diǎn)。子節(jié)點(diǎn)都起作用
chown -R mysql .
#將當(dāng)前目錄的所有組改為mysql組
chgrp -R mysql .
#這里的--basedir=/opt/mysql_5_5_17參數(shù)是我參考其他站點(diǎn)加上的;如果安裝到/usr/local/mysql應(yīng)該不用加這個(gè)參數(shù)
scripts/mysql_install_db --user=mysql --basedir=/opt/mysql_5_5_17
chown -R root .
chown -R mysql data
#關(guān)于my.cnf:mysql按照下列順序搜索my.cnf:/etc,mysql安裝目錄,安裝目錄下的data。/etc下的是全局設(shè)置。
#網(wǎng)上一些教程說放到/etc/my.cnf下;我這里放到/opt/mysql_5_5_17/my.cnf下了
cp support-files/my-medium.cnf ./my.cnf
#修改mysql最大連接數(shù)增加或修改max_connections=1024
#[mysqld]處添加服務(wù)器的默認(rèn)字符編碼character-set-server=utf8
#[mysql]處添加默認(rèn)字符編碼default-character-set=utf8
#編輯完保存退出
vim my.cnf
#啟動MySQL
bin/mysqld_safe --user=mysql &
#讓程序隨服務(wù)器啟動而自動啟動
cp support-files/mysql.server /etc/init.d/mysql
cd /etc/init.d
#編輯mysql.server文件,修改MySQL默認(rèn)的安裝路徑,即修改basedir值:basedir=/opt/mysql_5_5_17
#如果要修改數(shù)據(jù)目錄,也可修改datadir路徑值
vim mysql
chmod +x /etc/init.d/mysql
update-rc.d mysql defaults
關(guān)于Ubuntu自動啟動見《Ubuntu系統(tǒng)update-rc.d命令詳解》,官方文檔見自動啟動和停止 MySQL



至此啟動MySQL方法:
bin/mysqld_safe --user=mysql &

/etc/init.d/mysql start

關(guān)閉MySQL的方法
bin/mysqladmin -uroot shutdown

/etc/init.d/mysql stop


SIMONE 2011-10-25 14:16 發(fā)表評論
]]>
ubuntu 11.10 下安裝mysql5.5.17http://www.aygfsteel.com/wangxinsh55/archive/2011/10/24/361913.htmlSIMONESIMONEMon, 24 Oct 2011 11:14:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2011/10/24/361913.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/361913.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2011/10/24/361913.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/361913.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/361913.html下載最新的mysql-5.5.10-linux2.6-i686.tar.gz

shell切換到root用戶

安裝在/usr/local目錄下面
解壓縮文件
$cd /usr/local
$tar zxvf path/mysql-5.5.10-linux2.6-i686.tar.gz
$ln -s mysql-5.5.10-linux2.6-i686 mysql
添加用戶組
$groupadd mysql
給用戶組添加用戶
$useradd -r -g mysql mysql
給文件夾賦予用戶權(quán)限
$cd mysql
$chown -R mysql . (后面有點(diǎn))
$chgrp -R mysql .
安裝數(shù)據(jù)庫
$scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql

  注釋 如果這一步遇見error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory
請給系統(tǒng)安裝libaio-dev
$apt-get install libaio-dev
安裝完成之后再次執(zhí)行數(shù)據(jù)庫安裝命令

$chown -R root .
$chown -R mysql data
$cp support-files/my-medium.cnf /etc/my.cnf
啟動數(shù)據(jù)庫
$bin/mysqld_safe --user=mysql &

進(jìn)入數(shù)據(jù)庫管理命令
$bin/mysql -u -root -p

自動啟動
$cp support-files/mysql.server  /etc/init.d/mysql
以后啟動直接輸入
$/etc/init.d/mysql restart|start,,


=============================================================
使用二進(jìn)制安裝的好處

mysql安裝為什么大部分使用二進(jìn)制安裝。而不是源碼手動去編譯?

mysql使用的glibc進(jìn)行開發(fā)的。glibc庫是一個(gè)底層api,所以只要是linux,都會有g(shù)libc庫。所以,mysql安裝不需要考慮環(huán)境是否符合要求。移植性很方便。直接將編譯好的二進(jìn)制代碼復(fù)制到另外一個(gè)機(jī)器上,也是可以用的。

原 理性東西:一般在linux下安裝一個(gè)軟件,不同軟件所需要的函數(shù)庫不同。于是會遇到一個(gè)現(xiàn)象:一個(gè)軟件復(fù)制到另外一個(gè)平臺可能無法運(yùn)行。安裝軟件需要先 偵測環(huán)境就是出于此考慮。因?yàn)閙ysql使用的是通用的glibc函數(shù)庫。沒有對其他東西的依賴性。所以,從一個(gè)平臺復(fù)制到另外一個(gè)平臺能夠通用。并不需 要去偵測環(huán)境。直接使用編譯好的二進(jìn)制即可

手動編譯安裝,顯得步驟麻煩。基于mysql的特點(diǎn),二進(jìn)制安裝完全可以。

注:mysql5.5安裝的時(shí)候,需要用到cmake命令,所以需要保證你的機(jī)器上安裝了該命令。沒有的話,還要去安裝該cmake。也顯得麻煩。我暫時(shí)不想去安裝最新版本的了。


如果使用二進(jìn)制安裝升級怎么進(jìn)行?

升級獲取的還是二進(jìn)制壓縮包。那么,直接將指向目錄切換到新的目錄即可。

不需要涉及到像php一樣,手動編譯可以達(dá)到自己定制模塊的好處。而mysql安裝的時(shí)候不需要涉及到模塊

mysql官方建議安裝方式:二進(jìn)制安裝。

實(shí)踐過程

大致思路就是:解壓二進(jìn)制文件放到指定的目錄。然后安裝基本的數(shù)據(jù)庫,權(quán)限方面會用到。
然后,啟動mysql就行了。

第一步:創(chuàng)建一個(gè)用戶組和用戶。

組名和用戶名的名字都為mysql。

命令:1.groupadd mysql
      2.useradd -r -g mysql mysql


第二步:解壓二進(jìn)制壓縮包。
一般放到"/usr/local/src"目錄下去。
結(jié)果會變成:/usr/local/src/mysql安裝目錄

有很多種方式。一般可以直接進(jìn)去要解壓要存放的目錄。
運(yùn)行命令:tar zxvf 壓縮包源  注釋:第二個(gè)參數(shù)可以填要解壓到的位置。第二個(gè)參數(shù)不填,就會將壓縮包源解壓到運(yùn)行tar命令的當(dāng)前目錄。一般都是使用這種特性進(jìn)行解壓:你要解壓到哪里就先進(jìn)入哪里運(yùn)行tar命令。




第三步:建立一個(gè)軟鏈接。

在"usr/local"下建立一個(gè)軟鏈接(自己定義名為mysql)。軟鏈接的目錄是為了指向"/usr/local/src/mysql安裝目錄"

命令:ln -s /usr/local/src/mysql安裝目錄 /usr/local/mysql    參數(shù)說明:-s參數(shù)表示建立軟鏈接

去local目錄下查看,看是否成功生成了一個(gè)軟鏈接。使用"ls -al"查看,特點(diǎn)是軟連接上會有個(gè)箭頭符號。

其實(shí)這一步就是為了提供一種快捷操作的方式。其實(shí)不建立軟連接也是可以用的,為什么要這樣做?
升級管理有用:新版本單獨(dú)建立一個(gè)目錄存放的。假如你升級mysql了。只要將這個(gè)軟連接指向的目錄修改即可。


第四步:權(quán)限檢查與修改
主要是保證"mysql安裝目錄"的所有者為mysql用戶,所屬組也為mysql組。

1.chown -R mysql . //將當(dāng)前目錄的所有者改為mysql用戶  要加上-R參數(shù)。這個(gè)參數(shù)表示循環(huán)遍歷子節(jié)點(diǎn)。子節(jié)點(diǎn)都起作用
2.chgrp -R mysql . //將當(dāng)前目錄的所有組改為mysql組

常見的問題:忘記加上-R參數(shù)。結(jié)果下面節(jié)點(diǎn)沒有權(quán)限。啟動錯(cuò)誤,訪問錯(cuò)誤等等一系列的問題。




第五步:安裝初始化數(shù)據(jù)庫
運(yùn)行mysql安裝目錄下的文件:/scripts/mysql_install_db

命令備忘:scripts/mysql_install_db --user=mysql //這是進(jìn)入mysql安裝目錄下進(jìn)行運(yùn)行的,所以需要輸入路徑"scripts/"
注意:必須在安裝目錄下執(zhí)行。不能切換到scripts目錄下,然后執(zhí)行"./mysql_install_db --user=mysql",否則會報(bào)如下錯(cuò)誤:

FATAL ERROR: Could not find ./bin/my_print_defaults

因?yàn)槟_本mysql_install_db里面所使用的是這種形式的相對路徑"./bin/my_print_defaults",所以必須是在"mysql安裝目錄"下,才能找得到所需文件。

第二次試驗(yàn)的時(shí)候,還報(bào)出一個(gè)錯(cuò)誤:./bin/my_print_defaults: cannot execute binary file




第六步:my.cnf配置文件拷貝
將my.cnf文件移到etc/目錄下去。
命令:cp support-files/my-medium.cnf /etc/my.cnf






第七步:啟動mysql


馬上啟動mysql的命令是:bin/mysqld_safe --user=mysql & //"&"表示在后臺運(yùn)行
這里使用&的經(jīng)驗(yàn)備忘:執(zhí)行上面命令后,一直定在一個(gè)地方。沒有任何反應(yīng)了。并沒有報(bào)錯(cuò)信息。還是成功的。此時(shí)使用ctrl+c。然后去看看


之后,想讓服務(wù)器啟動的時(shí)候就跟著啟動mysql服務(wù)器,在一個(gè)目錄下放一個(gè)文件:

cp support-files/mysql.server /etc/init.d/mysql.server
support-files/mysql.server在二進(jìn)制安裝目錄下可以找到的。












完成后進(jìn)行的步驟:
第一步:如何查看mysql是否安裝成功。
一個(gè)方法是:去查看3306端口是否開啟
命令:netstat -ntl  可以列出所有偵聽的端口

第二個(gè)方法:使用mysql命令連接一次服務(wù)器
命令: mysql -u root

小技巧:為了省去每次執(zhí)行客戶端都要進(jìn)入目錄的麻煩。將客戶端的路徑加入環(huán)境變量中去。

shell命令:export PATH=$PATH:/usr/local/src/mysql-5.1/bin/

export命令備忘: export 變量名=變量值,這里變量名是PATH 變量值設(shè)置成在原來的$PATH基礎(chǔ)上加,有多個(gè)值,那么值之間以分號":"隔開。
這樣,在任意路徑中。都可以通過:"mysql -u 用戶名 -p" 的形式使用客戶端了。

所遇問題總結(jié)

第一個(gè)問題:

問題描述:SQLSTATE[HY000] [2002] Can't connect to local MySQL server through socket '/usr/local/mysql/tmp/mysql.sock'


問題經(jīng)驗(yàn):

不能通過 '/tmp/mysql.sock'連到服務(wù)器,而php標(biāo)準(zhǔn)配置正是用過'/tmp/mysql.sock'

1.php.ini中可以配置通過哪個(gè)sock去連接mysql
2.而mysql的配置文件中也可以自由配置使用哪個(gè)位置的sock文件

錯(cuò)誤提示中顯示了錯(cuò)誤2002號。結(jié)合手冊如下說明:

錯(cuò)誤:2002 (CR_CONNECTION_ERROR)

消息:不能通過套接字'%s' (%d)連接到本地MySQL服務(wù)器。


第二個(gè)問題:權(quán)限問題。

解決問題的經(jīng)驗(yàn)是:如果遇到啟動mysql錯(cuò)誤。首先應(yīng)該去看看權(quán)限是否有。設(shè)置對了沒。

比如啟動使用"service mysqld start"常常看到如下錯(cuò)誤提示:

mysqld_safe Logging to '/usr/local/mysql/data/localhost.localdomain.err'.
110306 23:17:20 mysqld_safe Starting mysqld daemon with databases from /usr/local/mysql/data
110306 23:17:20 mysqld_safe mysqld from pid file /usr/local/mysql/data/localhost.localdomain.pid ended

看不懂意思。這些信息會在data/*.err文件中記錄的。不知道上述報(bào)錯(cuò)信息的原因。

查看目錄下的子節(jié)點(diǎn),發(fā)現(xiàn)所有者和所屬組并不都是mysql。我直接設(shè)置好目錄的所有者和所屬組都是mysql后。就行了。


====================================================================
個(gè)人測試成功過程:
shell> groupadd mysql 
shell> useradd -r -g mysql mysql
shell> cd /usr/local
shell> tar zxvf /path/to/mysql-VERSION-OS.tar.gz
shell> ln -s full-path-to-mysql-VERSION-OS mysql
shell> cd mysql
shell> chown -R mysql .
shell> chgrp -R mysql .
shell> scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
shell> chown -R root .
shell> chown -R mysql data
# Next command is optional
shell> cp support-files/my-medium.cnf /etc/my.cnf
shell> bin/mysqld_safe --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql &
# Next command is optional
shell> cp support-files/mysql.server /etc/init.d/mysql.server
啟動后的日志寫在/var/log/mysql/error.log文件下,可直接到這個(gè)文件下去查看。


SIMONE 2011-10-24 19:14 發(fā)表評論
]]>
mysql數(shù)據(jù)庫備份及恢復(fù)http://www.aygfsteel.com/wangxinsh55/archive/2011/10/24/361874.htmlSIMONESIMONEMon, 24 Oct 2011 03:46:00 GMThttp://www.aygfsteel.com/wangxinsh55/archive/2011/10/24/361874.htmlhttp://www.aygfsteel.com/wangxinsh55/comments/361874.htmlhttp://www.aygfsteel.com/wangxinsh55/archive/2011/10/24/361874.html#Feedback0http://www.aygfsteel.com/wangxinsh55/comments/commentRss/361874.htmlhttp://www.aygfsteel.com/wangxinsh55/services/trackbacks/361874.html

還原一個(gè)數(shù)據(jù)庫:mysql -h localhost -u root -p123456 www

備份一個(gè)數(shù)據(jù)庫:mysqldump -h localhost -u root -p123456 www > d:\www2008-2-26.sql

其中WWW為數(shù)據(jù)庫名

//以下是在程序中進(jìn)行測試

//$command = “mysqldump –opt -h $dbhost -u $dbuser -p $dbpass $dbname | gzip > $backupFile”;
$command=”mysqldump -h localhost -u root -p123456 guestbook > guestbook2-29.sql”;
system($command);
echo “success”;

************************************************

備份MySQL數(shù)據(jù)庫的命令

mysqldump -hhostname -uusername -ppassword databasename > backupfile.sql
備份MySQL數(shù)據(jù)庫為帶刪除表的格式
備份MySQL數(shù)據(jù)庫為帶刪除表的格式,能夠讓該備份覆蓋已有數(shù)據(jù)庫而不需要手動刪除原有數(shù)據(jù)庫。

mysqldump –add-drop-table -uusername -ppassword databasename > backupfile.sql
直接將MySQL數(shù)據(jù)庫壓縮備份

mysqldump -hhostname -uusername -ppassword databasename | gzip > backupfile.sql.gz
備份MySQL數(shù)據(jù)庫某個(gè)(些)表

mysqldump -hhostname -uusername -ppassword databasename specific_table1 specific_table2 > backupfile.sql
同時(shí)備份多個(gè)MySQL數(shù)據(jù)庫

mysqldump -hhostname -uusername -ppassword –databases databasename1 databasename2 databasename3 > multibackupfile.sql
僅僅備份數(shù)據(jù)庫結(jié)構(gòu)

mysqldump –no-data –databases databasename1 databasename2 databasename3 > structurebackupfile.sql
備份服務(wù)器上所有數(shù)據(jù)庫

mysqldump –all-databases > allbackupfile.sql
還原MySQL數(shù)據(jù)庫的命令

mysql -hhostname -uusername -ppassword databasename < backupfile.sql
還原壓縮的MySQL數(shù)據(jù)庫

gunzip < backupfile.sql.gz | mysql -uusername -ppassword databasename
將數(shù)據(jù)庫轉(zhuǎn)移到新服務(wù)器

mysqldump -uusername -ppassword databasename | mysql –host=*.*.*.* -C databasename

幾個(gè)常用用例:
1.導(dǎo)出整個(gè)數(shù)據(jù)庫
mysqldump -u 用戶名 -p 數(shù)據(jù)庫名 > 導(dǎo)出的文件名
mysqldump -u root -p dataname >dataname.sql
這個(gè)時(shí)候會提示要你輸入root用戶名的密碼,輸入密碼后dataname數(shù)據(jù)庫就成功備份在mysql/bin/目錄中.

2.導(dǎo)出一個(gè)表
mysqldump -u 用戶名 -p 數(shù)據(jù)庫名 表名> 導(dǎo)出的文件名
mysqldump -u root -p dataname users> dataname_users.sql

3.導(dǎo)出一個(gè)數(shù)據(jù)庫結(jié)構(gòu)
mysqldump -u wcnc -p -d –add-drop-table smgp_apps_wcnc >d:\wcnc_db.sql
-d 沒有數(shù)據(jù) –add-drop-table 在每個(gè)create語句之前增加一個(gè)drop table

4.導(dǎo)入數(shù)據(jù)庫
常用source 命令
進(jìn)入mysql數(shù)據(jù)庫控制臺,
如mysql -u root -p

mysql>use 數(shù)據(jù)庫

然后使用source命令,后面參數(shù)為腳本文件(如這里用到的.sql)
mysql>source d:\wcnc_db.sql

mysqldump支持下列選項(xiàng):
–add-locks
在每個(gè)表導(dǎo)出之前增加LOCK TABLES并且之后UNLOCK TABLE。(為了使得更快地插入到MySQL)。

–add-drop-table
在每個(gè)create語句之前增加一個(gè)drop table。

–allow-keywords
允許創(chuàng)建是關(guān)鍵詞的列名字。這由表名前綴于每個(gè)列名做到。

-c, –complete-insert
使用完整的insert語句(用列名字)。

-C, –compress
如果客戶和服務(wù)器均支持壓縮,壓縮兩者間所有的信息。

–delayed
用INSERT DELAYED命令插入行。

-e, –extended-insert
使用全新多行INSERT語法。(給出更緊縮并且更快的插入語句)

-#, –debug[=option_string]
跟蹤程序的使用(為了調(diào)試)。

–help
顯示一條幫助消息并且退出。

–fields-terminated-by=…

–fields-enclosed-by=…

–fields-optionally-enclosed-by=…

–fields-escaped-by=…

–fields-terminated-by=…

這些選擇與-T選擇一起使用,并且有相應(yīng)的LOAD DATA INFILE子句相同的含義。
LOAD DATA INFILE語法。

-F, –flush-logs
在開始導(dǎo)出前,洗掉在MySQL服務(wù)器中的日志文件。

-f, –force,
即使我們在一個(gè)表導(dǎo)出期間得到一個(gè)SQL錯(cuò)誤,繼續(xù)。

-h, –host=..
從命名的主機(jī)上的MySQL服務(wù)器導(dǎo)出數(shù)據(jù)。缺省主機(jī)是localhost。

-l, –lock-tables.
為開始導(dǎo)出鎖定所有表。

-t, –no-create-info
不寫入表創(chuàng)建信息(CREATE TABLE語句)

-d, –no-data
不寫入表的任何行信息。如果你只想得到一個(gè)表的結(jié)構(gòu)的導(dǎo)出,這是很有用的!

–opt
同–quick –add-drop-table –add-locks –extended-insert –lock-tables。
應(yīng)該給你為讀入一個(gè)MySQL服務(wù)器的盡可能最快的導(dǎo)出。

-pyour_pass, –password[=your_pass]
與服務(wù)器連接時(shí)使用的口令。如果你不指定“=your_pass”部分,mysqldump需要來自終端的口令。

-P port_num, –port=port_num
與一臺主機(jī)連接時(shí)使用的TCP/IP端口號。(這用于連接到localhost以外的主機(jī),因?yàn)樗褂?Unix套接字。)

-q, –quick
不緩沖查詢,直接導(dǎo)出至stdout;使用mysql_use_result()做它。

-S /path/to/socket, –socket=/path/to/socket
與localhost連接時(shí)(它是缺省主機(jī))使用的套接字文件。

-T, –tab=path-to-some-directory
對于每個(gè)給定的表,創(chuàng)建一個(gè)table_name.sql文件,它包含SQL CREATE 命令,和一個(gè)table_name.txt文件,它包含數(shù)據(jù)。注意:這只有在mysqldump運(yùn)行在mysqld守護(hù)進(jìn)程運(yùn)行的同一臺機(jī)器上的時(shí)候才工 作。.txt文件的格式根據(jù)–fields-xxx和 –lines–xxx選項(xiàng)來定。

-u user_name, –user=user_name
與服務(wù)器連接時(shí),MySQL使用的用戶名。缺省值是你的Unix登錄名。

-O var=option, –set-variable var=option
設(shè)置一個(gè)變量的值。可能的變量被列在下面。

-v, –verbose
冗長模式。打印出程序所做的更多的信息。

-V, –version
打印版本信息并且退出。

-w, –where=’where-condition’
只導(dǎo)出被選擇了的記錄;注意引號是強(qiáng)制的!
“–where=user=’jimf’” “-wuserid>1″ “-wuserid<1″

最常見的mysqldump使用可能制作整個(gè)數(shù)據(jù)庫的一個(gè)備份:
mysqldump –opt database > backup-file.sql

但是它對用來自于一個(gè)數(shù)據(jù)庫的信息充實(shí)另外一個(gè)MySQL數(shù)據(jù)庫也是有用的:
mysqldump –opt database | mysql –host=remote-host -C database
由于mysqldump導(dǎo)出的是完整的SQL語句,所以用mysql客戶程序很容易就能把數(shù)據(jù)導(dǎo)入了:

shell> mysqladmin create target_db_name
shell> mysql target_db_name < backup-file.sql
就是
shell> mysql 庫名 < 文件名



最近這兩天,因?yàn)橹霸O(shè)計(jì)數(shù)據(jù)庫的 時(shí)候沒有注意到有的表是要建在另外一臺服務(wù)器上面的(測試服務(wù)器數(shù)據(jù)庫是分布式的,不同的表可能在不同服務(wù)器上)。現(xiàn)在里面已經(jīng)有很多測試數(shù)據(jù)了,又不想 重新添加一遍。所以就想能不能備份出來,再恢復(fù)到目標(biāo)機(jī)器上去。然后昨天的話就折騰了一下,請教同事,上網(wǎng)查資料。這里把用法記錄一下。
mysqldump命令:MySQL數(shù)據(jù)庫備份還原
 
一、常用操作:
備份整個(gè)數(shù)據(jù)庫
格式:
mysqldump -h主機(jī)名  -P端口 -u用戶名 -p密碼 (–database) 數(shù)據(jù)庫名 > 文件名.sql
mysqldump -h{hostname} -P{port} -u{username} -p{password} {databasename} > {backupfile.sql}
例如:
 
代碼如下:
1
mysqldump -hlocalhost -P3306 -uzhuchao -p123456 db_test > backfile1.sql
備份MySQL數(shù)據(jù)庫為帶刪除表的格式
備份MySQL數(shù)據(jù)庫為帶刪除表的格式,能夠讓該備份覆蓋已有數(shù)據(jù)庫而不需要手動刪除原有數(shù)據(jù)庫。
格式:mysqldump -–add-drop-table -u{username} -p{password} {databasename} > {backfile.sql}
例如:
 
代碼如下:
1
mysqldump -–add-drop-table –uzhuchao -p123456 db_test > backfile2.sql
直接將MySQL數(shù)據(jù)庫壓縮備份
格式:mysqldump -h{hostname} -u{username} -p{password} {databasename} | gzip > {backfile.sql.gz}
例如:
 
代碼如下:
1
mysqldump –hlocalhost –uzhuchao –p123456 db_test1 | gzip > backfile3.sql.gz
備份MySQL數(shù)據(jù)庫某個(gè)(些)表
格式:mysqldump -h主機(jī)名  -P端口 -u用戶名 -p密碼 (–tables | –quick) 數(shù)據(jù)庫名 表名1 (表名2 …) > 文件名.sql (括號中的可缺省)。
mysqldump -h{hostname} (-P{port}) -u{user} -p{password} (–tables | –quick) {databasename} {table1} {table2} > {backfile.sql}
例如:
 
代碼如下:
1
2
3
4
mysqldump -hlocalhost -uzhuchao -p123456 db_test tbl_test > backfile4-1.sql
mysqldump -hlocalhost -P3306 -uzhuchao -p123456 db_test tbl_test > backfile4-2.sql
mysqldump -hlocalhost -P3306 -uzhuchao -p123456 --quick db_test tbl_test > backfile4-3.sql
mysqldump -hlocalhost -P3306 -uzhuchao -p123456 --tables db_test tbl_test1 tbl_test2 > backfile4-4.sql
同時(shí)備份多個(gè)MySQL數(shù)據(jù)庫
格式:mysqldump -h{hostname} (-P{port}) -u{username} -p{password} –databases {databasename1} {databasename2} {databasename3} > multibackfile.sql
例如:
 
代碼如下:
1
mysqldump -hlocalhost -uzhuchao -p123456 –databases db_test1 db_test2 db_test3 > multibackfile.sql
僅僅備份數(shù)據(jù)庫結(jié)構(gòu)
格式:mysqldump –no-data –databases {databasename1} {databasename2} > {structurebackfile.sql}
例如:
 
代碼如下:
1
mysqldump –no-data –databases db_test1 db_test2 > structurebackfile.sql
備份服務(wù)器上所有數(shù)據(jù)庫
格式:mysqldump –all-databases > allbackupfile.sql
 
========================================================================
 
還原MySQL數(shù)據(jù)庫的命令
格式:mysql -h{hostname} -u{username} -p{password} {databasename} < {backfile.sql}
例如:
 
代碼如下:
1
mysql -hlocalhost -uroot -p123456 db_test4 < back_file1.sql
還原壓縮的MySQL數(shù)據(jù)庫
格式:gunzip < {backfile.sql.gz} | mysql –u{username} –p{password} {databasename}
例如:
 
代碼如下:
1
gunzip < backfile.sql.gz | mysql –uzhuchao –p123456 db_test5
將數(shù)據(jù)庫轉(zhuǎn)移到新服務(wù)器
mysqldump –u{username} –p{password} {databasename} | mysql –host=*.*.*.* –C {databasename}
 
二、其他:
1、如果端口為默認(rèn)的3306時(shí),可省略 -P {端口號} 這一項(xiàng)。
 
2、命令行格式中 { } 中的內(nèi)容都是變量
主機(jī)名 : {hostname}
端   口:{port}    (一般默認(rèn)3306,可缺省)
用戶名:{user} {username} (如root)
密   碼:{password}
數(shù)據(jù)庫名 :{databasename}
表   名:{table}  {table1}  {table2}
文件名:{backfile.sql}


SIMONE 2011-10-24 11:46 發(fā)表評論
]]>
主站蜘蛛池模板: 金华市| 沿河| 武义县| 巴里| 萨嘎县| 光泽县| 横山县| 卓资县| 安吉县| 靖西县| 九龙坡区| 包头市| 长丰县| 鲁山县| 东海县| 左权县| 体育| 临夏市| 龙川县| 石泉县| 溆浦县| 喀喇| 峨眉山市| 黄冈市| 博湖县| 恩平市| 张家川| 周口市| 法库县| 西峡县| 赞皇县| 平和县| 会理县| 麟游县| 左权县| 新营市| 阳曲县| 凤台县| 北宁市| 明光市| 辽阳县|