安裝與配置
使用apt 安裝 mysqlapt install mysql
度液,其中二進(jìn)制文件放置在/usr/bin/mysql
湾碎,配置文件在/etc/mysql
宙攻。
打開配置文件vim /etc/mysql/mysql.conf.d/mysqld.cnf
,可以看到默認(rèn)的參數(shù)設(shè)置:
[mysqld]
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc-messages-dir = /usr/share/mysql
對應(yīng)了mysql啟動的一些參數(shù)介褥。
在這里進(jìn)行一些修改座掘,使其能夠通過外部ip進(jìn)行訪問:
- 注釋掉
bind-address
,或者修改為0.0.0.0 - 本地進(jìn)入mysql后選擇mysql庫呻顽,執(zhí)行
update user set host='%' where user='root';
雹顺,使root用戶可以在任何地方登陸 - 重啟mysql
service mysql restart
引擎
InnoDB
InnoDB是MySQL的默認(rèn)引擎,主要擁有以下幾個功能:
- ACID事務(wù)
- 存儲過程
- 視圖
- 行級鎖定
- 支持外鍵
應(yīng)用場景:
- 以INSERT廊遍、UPDATE為主的應(yīng)用嬉愧。
- 更新密集的表。InnoDB存儲引擎特別適合處理多重并發(fā)的更新請求喉前。
- 事務(wù)没酣。InnoDB存儲引擎是支持事務(wù)的標(biāo)準(zhǔn)MySQL存儲引擎王财。
- 自動災(zāi)難恢復(fù)。與其它存儲引擎不同裕便,InnoDB表能夠自動從災(zāi)難中恢復(fù)绒净。
- 外鍵約束。MySQL支持外鍵的存儲引擎只有InnoDB偿衰。
注意點(diǎn):
- 對于InnoDB每一條SQL語言都默認(rèn)封裝成事務(wù)挂疆,自動提交,這樣會影響速度下翎,所以最好把多條SQL語言放在begin和commit之間缤言,組成一個事務(wù)。
- InnoDB是聚集索引视事,數(shù)據(jù)文件是和索引綁在一起的胆萧,必須要有主鍵,通過主鍵索引效率很高俐东。但是輔助索引需要兩次查詢跌穗,先查詢到主鍵,然后再通過主鍵查詢到數(shù)據(jù)虏辫。因此蚌吸,主鍵不應(yīng)該過大,因?yàn)橹麈I太大砌庄,其他索引也都會很大套利。
- 行級鎖只在涉及對索引字段操作的情況下,其余情況都會鎖全表鹤耍。
MyISAM
- 相比于InnoDB肉迫,MyISAM類型的表強(qiáng)調(diào)的是性能,其執(zhí)行數(shù)度比InnoDB類型更快稿黄,但是不提供事務(wù)支持喊衫。
- 如果執(zhí)行大量的SELECT,MyISAM是更好的選擇杆怕。
- AUTO_INCREMENT性能上MyISAM更快族购,并且支持復(fù)合主鍵自增。
- MyISAM是非聚集索引陵珍,數(shù)據(jù)文件是分離的寝杖,索引保存的是數(shù)據(jù)文件的指針。主鍵索引和輔助索引是獨(dú)立的互纯。
區(qū)別
- InnoDB支持外鍵瑟幕,而MyISAM不支持。對一個包含外鍵的InnoDB表轉(zhuǎn)為MYISAM會失敗只盹;
- InnoDB不保存表的具體行數(shù)辣往,執(zhí)行select count(*) from table時需要全表掃描。而MyISAM用一個變量保存了整個表的行數(shù)殖卑,執(zhí)行上述語句時只需要讀出該變量即可站削,速度很快;
- Innodb不支持全文索引孵稽,而MyISAM支持全文索引许起,查詢效率上MyISAM要高;
主從同步
主服務(wù)器配置
首先修改主從服務(wù)器的配置文件
vim /etc/mysql/mysql.conf.d/mysqld.cnf
server-id = 128 #這個通常設(shè)置為ip最后一段
log_bin = /var/log/mysql/mysql-bin.log #二進(jìn)制文件路徑
binlog_do_db = test_copy #設(shè)置要同步的數(shù)據(jù)庫
在主服務(wù)器上添加一個sync用戶用于從數(shù)據(jù)庫訪問
GRANT REPLICATION SLAVE ON *.* to 'sync'@'%' identified by 'sync_pass';
然后重啟服務(wù)器
使用SHOW MASTER STATUS
查看主服務(wù)器狀態(tài):
+------------------+------------+----------------+--------------------+---------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
|------------------+------------+----------------+--------------------+---------------------|
| mysql-bin.000002 | 154 | test_copy | | |
+------------------+------------+----------------+--------------------+---------------------+
從服務(wù)器配置
修改配置:
server-id=1
然后配置同步參數(shù)
change master to MASTER_HOST='192.168.88.128', MASTER_USER='sync',MASTER_PASSWORD='sync_pass';
啟動從數(shù)據(jù)庫服務(wù)
START SLAVE
SHOW SLAVE STATUS\G
***************************[ 1. row ]***************************
Slave_IO_State | Waiting for master to send event
Master_Host | 192.168.88.128
Master_User | sync
Master_Port | 3306
Connect_Retry | 60
Master_Log_File | mysql-bin.000002
Read_Master_Log_Pos | 154
Relay_Log_File | DESKTOP-0ODM788-relay-bin.000002
Relay_Log_Pos | 320
Relay_Master_Log_File | mysql-bin.000002
Slave_IO_Running | Yes
Slave_SQL_Running | Yes
這里的關(guān)鍵點(diǎn)為Slave_IO_Running
和Slave_SQL_Running
都需要為Yes菩鲜,一個為No則未配置成功街氢。
如需修改從服務(wù)器的配置需要先停掉同步STOP SLAVE
,然后使用change master to master_log_file='mysql-bin.000002',master_log_pos=154;
進(jìn)行修改睦袖。
確認(rèn)同步成功:
主服務(wù)器執(zhí)行
mysql root@localhost:test_copy> select * from t_test
+-----------+
| test_id |
|-----------|
| 1111 |
+-----------+
從服務(wù)器執(zhí)行
mysql (none)@localhost:test_copy> select * from t_test
+---------+
| test_id |
+---------+
| 1111 |
+---------+
主服務(wù)器執(zhí)行插入操作
mysql root@localhost:test_copy> INSERT INTO t_test VALUES (1)
Query OK, 1 row affected
Time: 0.011s
從服務(wù)器查詢
mysql (none)@localhost:test_copy> select * from t_test
+---------+
| test_id |
+---------+
| 1111 |
| 1 |
+---------+
2 rows in set
數(shù)據(jù)備份
使用mysqldumps進(jìn)行數(shù)據(jù)備份操作:
mysqldump -uroot --all-databases >/tmp/all.sql #導(dǎo)出所有數(shù)據(jù)庫
mysqldump -uroot --databases dbname1 dbname2 >/tmp/all.sql #導(dǎo)出特定的數(shù)據(jù)庫
數(shù)據(jù)恢復(fù)mysql -u root -p <backup.sql
或者登陸到數(shù)據(jù)庫后使用source backup.sql
進(jìn)行還原
分區(qū)表
分區(qū)類型
- RANGE 分區(qū):基于屬于一個給定連續(xù)區(qū)間的列值,把多行分配給分區(qū)荣刑。
- LIST 分區(qū):類似于按RANGE分區(qū)馅笙,區(qū)別在于LIST分區(qū)是基于列值匹配一個離散值集合中的某個值來進(jìn)行選擇。
- HASH分區(qū):基于用戶定義的表達(dá)式的返回值來進(jìn)行選擇的分區(qū)厉亏,該表達(dá)式使用將要插入到表中的這些行的列值進(jìn)行計(jì)算董习。這個函數(shù)可以包含MySQL中有效的、產(chǎn)生非負(fù)整數(shù)值的任何表達(dá)式爱只。
- KEY分區(qū):類似于按HASH分區(qū)皿淋,區(qū)別在于KEY分區(qū)只支持計(jì)算一列或多列,且MySQL服務(wù)器提供其自身的哈希函數(shù)恬试。必須有一列或多列包含整數(shù)值窝趣。
- 復(fù)合分區(qū):基于RANGE/LIST 類型的分區(qū)表中每個分區(qū)的再次分割。子分區(qū)可以是 HASH/KEY 等類型训柴。
使用RANGE進(jìn)行分區(qū)
CREATE TABLE t5(id INT,dt DATETIME NOT NULL)
PARTITION BY RANGE (TO_DAYS(dt)) (
PARTITION p0 VALUES LESS THAN (TO_DAYS('2017-09-01')),
PARTITION p1 VALUES LESS THAN (TO_DAYS('2017-10-01')),
PARTITION p2 VALUES LESS THAN (TO_DAYS('2017-11-01')),
PARTITION p3 VALUES LESS THAN MAXVALUE);
Range需要分區(qū)字段為int
使用LIST進(jìn)行分區(qū)
CREATE TABLE t_partition_range(id INT NOT NULL ,number INT NOT NULL)
PARTITION BY LIST(number)(
PARTITION p0 VALUES IN (1),
PARTITION p1 VALUES IN (2),
);