MySQL重點內容:查詢語句、名稱解析
包管理器(rpm, deb)
通用二進制格式;
源碼編譯安裝;
SQL:
數據庫、表、索引、視圖、存儲過程、存儲函數、觸發器、事件調度器、用戶和權限;
元數據數據庫:庫名為mysql
MYSQL語句:有2種
DDL, DML
DDL: CREATE, ALTER, DROP
DML: INSERT, DELETE, UPDATE, SELECT
DCL: GRANT(授權), REVOKE(撤銷授權)
MariaDB程序的組成:C/S架構
C:Client
mysql:CLI交互式客戶端程序;
mysqldump:邏輯備份工具;
mysqladmin:管理工具;
mysqlbinlog:查看二進制日誌的工具;
方法1: 用SET PASSWORD命令
首先登錄MySQL。
格式:mysql> set password for 用戶名@localhost = password(‘新密碼‘);
例子:mysql> set password for root@localhost = password(‘123‘);
方法2:用mysqladmin
格式:mysqladmin -u用戶名 -p舊密碼 password 新密碼
例子:mysqladmin -uroot -p123456 password 123
方法3:用UPDATE直接編輯user表
首先登錄MySQL。
mysql> update user set password=password(‘123‘) where user=‘root‘ and host=‘localhost‘;
mysql> flush privileges;
方法4:在忘記root密碼的時候,可以這樣
以windows為例:
- 關閉正在運行的MySQL服務。
- 打開DOS窗口,轉到mysql\bin目錄。
- 輸入mysqld --skip-grant-tables 回車。--skip-grant-tables 的意思是啟動MySQL服務的時候跳過權限表認證。
- 再開一個DOS窗口(因為剛才那個DOS窗口已經不能動了),轉到mysql\bin目錄。
- 輸入mysql回車,如果成功,將出現MySQL提示符 >。
- 連接權限數據庫: use mysql; 。
- 改密碼:update user set password=password("123") where user="root";(別忘了最後加分號) 。
- 刷新權限(必須步驟):flush privileges; 。
- 退出 quit。
-
註銷系統,再進入,使用用戶名root和剛才設置的新密碼123登錄。
1、ps aux | grep mysql:查看是否運行mysqld_safe為服務端程序
2、mysql -e ‘SHOW DATABASES;‘:執行一次數據庫命令,回到bash命令行
3、CREATE SCHEMA IF NOT EXISTS testdb; 創建名為testdb的數據庫,且如果不存在就創建
4、查看支持的所有字符集:SHOW CHARACTER SET 查看支持的所有排序規則:SHOW COLLATION
5、ALTER TABLE students ADD class VARCHAR(100) NOT NULL; 在students表中添加class字段,類型為可變長字段、長度最大100個字節、此字段不能為空;
6、ALTER TABLE students DROP class; 刪除表中的class字段
7、ALTER TABLE students ADD class VARCHAR(100) NOT NULL AFTER name; 指定把class字段添加在name字段後面> DESC students; 查看表的字段
8、 ALTER TABLE students MODIFY class VARCHAR(100) AFTER age;把class字段改在age字段後面
9、ALTER TABLE students DROP PRIMARY KEY; 刪除主鍵
10、ALTER TABLE students ADD UNIQUE KEY (name); 添加name字段為主鍵,如果此字段要求不能為空,則字段變為唯一鍵
11、SHOW INDEX FROM students; 查看tudents表中索引信息
12、ALTER TABLE students DROP INDEX name; 刪除students表中索引名為name
13、ALTER TABLE students ADD INDEX class (class); 添加字段class的索引為class,索引名和字段名可相同
14、DROP TABLE students; 刪除表studnets
15、索引有兩種類型,一種是樹狀是索引,一種是hash索引;mysql使用的是btree索引,b樹索引也叫平衡樹;b樹索有3種:b-樹,b樹,b+樹;mysql用的是b+樹;
16、 CREATE INDEX name_and_class ON students (name,class); 添加name和class為索引, DROP INDEX name_and_class ON students; 刪除索引;
17、SELECT id,name FROM students; 查看指定字段;即投影
18、SELECT FROM students; 從students表中查看所有字段
19、 SELECT id as stuID,name FROM students; 顯示時把id字段顯示為別名為stuID
20、SELECT FROM students WHERE id=1; 查詢表中,id=1的所有信息
21、SELECT name,age FROM students WHERE age > 30 and age < 80; 組合條件查詢;SELECT name,age FROM students WHERE age >= 30 and age =< 80; 顯示age和name字段,且符合age的條件;
SELECT name,age FROM students WHERE age BETWEEN 30 and 80; 同上,between..and表示範圍區間
22、SELECT name FROM students WHERE name LIKE ‘%n%‘; 使用mysql中的模式匹配查看name中包含n的字段
23、SELECT name FROM students WHERE name RLIKE ‘^.n.$‘; 使用正則式模式匹配;查詢結果同上
24、SELECT name,age FROM students WHERE age IS NULL; 查詢age字段為空,只顯示name和age字段
25、SELECT id,name FROM students ORDER BY name; 根據name字段排序,默認為升序,只顯示id和name字段
26、SELECT id,name FROM students ORDER BY name DESC; 根據name降序排序
27、DELETE FROM students ORDER BY age DESC LIMIT 20; 刪除age最大的前20個用戶的行;
28、SELECT name,age FROM students WHERE name NOT LIKE ‘stu%‘; 查找name,age字段,name不是stu開頭的字段的行
29、UPDATE students SET age=age-5 WHERE name NOT LIKE ‘stu%‘;查找name字段,不是stu開頭的字段,age-5
30、UPDATE students SET age=age-5 ORDER BY id DESC LIMIT 5; 只改id最大的前5個用戶,把age字段-5
用戶賬號及權限管理:
db_name.tbl_name:庫名.表名;
.:所有庫的所有表;
db_name.*:指定庫的所有表;
db_name.tbl_name:指定庫的特定表;
db_name.routine_name:指定庫上的存儲過程或存儲函數;
如果db_name與routine_name同名,只能靠object_type來區別;
31、CREATE USER ‘testuser‘@‘172.18.%.%.‘ IDENTIFIED BY ‘testpass‘; 創建用戶testuser,密碼為testpass; > FLUSH PRIVILEGES; 刷新授權表
32、GRANT SELECT ON testdb.students TO ‘testuser‘@‘172.18.%.%‘; 授權testuser用戶有SELECT權限,對testdb庫中的students表 FLUSH PRIVILEGES; 刷新授權
33、REVOKE INSERT ON mydb.students FROM ‘testuser‘@‘172.18.%.%‘; 回收INSERT授權
34、授權時不影響原來的權限;授權是累加的
SHOW GRANTS FOR ‘testuser‘@‘172.18.%.%‘; 查看指定用戶的授權;
SHOW GRANTS FOR CURRENT_USER; 查看當前用戶的權限;
35、 SELECT Host,User,Password FROM user; 查看系統安裝後會有2個匿名用戶;且root用戶密碼為空;是不安全的
36、mysql_secure_installation運行
確定輸入密碼;回車
輸入y,密碼為root,再確認密碼為root;
Remove anonymous users? [Y/n] y 是否刪除數據庫匿名用戶
Disallow root login remotely? [Y/n] n 是否禁止管理員root遠程登錄
Remove test database and access to it? [Y/n] n 是否移除test庫
Reload privilege tables now? [Y/n] y 是否重載授權
二進制日誌部分:
37、查看二進制日誌是否開啟:
38、查看二進制日誌文件列表:
39、查看二進制日誌的記錄模式:
40、查看二進制日誌文件的內容:show binlog events in “二進制日誌文件名”
41、從指定位置查看二進制日誌:
42、只顯示二進制日誌的前三行:
43、從第一行之後開始顯示,只顯示之後的2行:
44、從245位置之後的第一行開始顯示,顯示2行:
45、查看當前在使用哪一個二進制日誌,以及二進制日誌記錄到哪個位置了:
二進制日誌是會滾動的,當單個二進制日誌達到指定大小時,就會滾動,使用flush logs命令即可滾動,重啟mysql服務也會自動滾動,
46、在文件系統中使用“ mysqlbinlog ”查看對應的二進制日誌:
紅色標註是固定的開頭內容:版本屬性信息,藍色標誌是要查詢的信息,
mysql中常見的備份工具:
47、從某處開始,到某處結束,查看該區間的二進制日誌文件:
mysqlbinlog --start-position 317 --stop-position 442 mybinlog.000001
48、從指定的時間開始查看,到指定的時間結束,例:查詢2019年2月1日12點20分以後的日誌:
mysqlbinlog --start-datetime "2019-2-1 12:20:00" --stop-datetime "2019-2-1 12:30:00" mysqlbinlog 000001
49、利用 select 導出a表數據到/testdir/a.backup中
select * from a into outfile ‘/testdir/a.backup’;
50、利用a.backup文件恢復a表內容,先創建一張新表,使用load data將a.backup中的數據導入到新表:
create table b(id int);
load data infile "/testdir/a.backup" into table b;
51、mysqldump是mysql自帶的備份工具,它是一種邏輯備份工具,它會將數據從數據庫讀出,轉化為對應的sql的語句,mysqldump能夠實現完全備份或部分備份。使用innodb表類型的表能夠使用mysqldump進行熱備,使用myisam表類型的表只能使用mysqldump進行溫備。
52、xtrabackup支持對innodb存儲引擎做熱備,是一種物理備份工具,性能強悍,支持完全備份、差異備份、增量備份、部分備份、
53、不是rpm包安裝的mysql,啟動及關閉:
啟動:/usr/bin/mysqld_safe & 關閉:mysqladmin -uroot shutdown
54、查看字符集相關的全局設置:
show global variables where variables_name like ‘character%‘
55、查看會話級別的變量並用set修改:
56、將tb1表中id號為13的行中的name字段的值改為Luffy:
update tb1 set name="luffy" where id=13;
存儲引擎:
57、mysql中,存儲引擎是插件式的,同一個數據庫中的不同的表可以使用不同的存儲引擎,也被稱為“表類型”,
58、查看默認的存儲引擎:show engines;
59、一次性查看某個數據庫中所有表中都使用哪些存儲引擎:students和t1都用innodb的存儲引擎:
60、在創建表時就指定當前表使用哪種存儲引擎:
61、刪除用戶:delete from mysql.user where user=‘wpuser‘ and host=‘192.168.151.%‘;
62、將用戶root的密碼改為空: update mysql.user set password=‘‘ where user=‘root‘;
63、創建/刪除數據庫: create/drop database name;
64、清除指定二進制日誌:purge binary logs to ‘mariadb-bin.000003‘;刪除3之前的日誌存儲過程:
存儲過程優勢
存儲過程把經常使用的SQL語句或業務邏輯封裝起來,預編譯保存在數據庫中,
當需要時從數據庫中直接調用,省去了編譯的過程
提高了運行速度
同時降低網絡數據傳輸量
存儲過程與自定義函數的區別
存儲過程實現的過程要復雜一些,而函數的針對性較強
存儲過程可以有多個返回值,而自定義函數只有一個返回值
存儲過程一般獨立的來執行,而函數往往是作為其他SQL語句的一部分來使用
觸發器示例
CREATE TABLE student_info (
stu_id INT(11) NOT NULL AUTO_INCREMENT,
stu_name VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (stu_id) );
CREATE TABLE student_count (
student_count INT(11) DEFAULT 0 );
INSERT INTO student_count VALUES(0);
觸發器示例
示例:創建觸發器,在向學生表INSERT數據時,學生數增加,DELETE學生時,學生數減少
CREATE TRIGGER trigger_student_count_insert
AFTER INSERT
ON student_info FOR EACH ROW
UPDATE student_count SET student_count=student_count+1;
CREATE TRIGGER trigger_student_count_delete
AFTER DELETE
ON student_info FOR EACH ROW
UPDATE student_count SET student_count=student_count-1;
查看觸發器:SHOW TRIGGERS 刪除觸發:DROP TRIGGER trigger_name;
MySQL用戶和權限
用戶管理:
創建用戶:CREATE USER
CREATE USER ‘USERNAME‘@‘HOST‘ [IDENTIFIED BY ‘password‘];
默認權限:USAGE
用戶重命名:RENAME USER
RENAME USER old_user_name TO new_user_name;
刪除用戶: DROP USER ‘USERNAME‘@‘HOST‘
示例:刪除默認的空用戶 DROP USER ‘‘@‘localhost‘;
修改密碼:
mysql>SET PASSWORD FOR ‘user‘@‘host‘ = PASSWORD(‘password‘);
mysql>UPDATE mysql.user SET password=PASSWORD(‘password‘)
WHERE clause;
此方法需要執行下面指令才能生效:
mysql> FLUSH PRIVILEGES;
#mysqladmin -u root -poldpass password ‘newpass’
忘記管理員密碼的解決辦法:
啟動mysqld進程時,為其使用如下選項: --skip-grant-tables --skip-networking
使用UPDATE命令修改管理員密碼
關閉mysqld進程,移除上述兩個選項,重啟mysqld
授權:
GRANT priv_type [(column_list)],... ON [object_type] priv_level TO ‘user‘@‘host‘[IDENTIFIED BY ‘password‘] [WITH GRANT OPTION];
回收授權:
REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ... ON [object_type] priv_level FROM user [, user] ... 示例:REVOKE DELETE ON testdb.* FROM ‘testuser‘@‘172.16.0.%’;
重讀授權表:mysql> FLUSH PRIVILEGE
存儲引擎:
MyISAM引擎特點
不支持事務、表級鎖定、讀寫相互阻塞,寫入不能讀,讀時不能寫、只緩存索引、不支持外鍵約束、不支持聚簇索引、讀取數據較快,占用資源較少、不支持MVCC(多版本並發控制機制)高並發、崩潰恢復性較差、MySQL5.5.5前默認的數據庫引擎
查看mysql支持的存儲引擎:show engines;
查看當前默認的存儲引擎:show variables like ‘%storage_engine%‘;
設置默認的存儲引擎
vim /etc/my.conf
[mysqld]
default_storage_engine= InnoDB
查看庫中指定表的存儲引擎
show table status like ‘ tb_name ‘;
show create table tb_name;
設置表的存儲引擎:
CREATE TABLE tb_name(... ) ENGINE=InnoDB;
ALTER TABLE tb_name ENGINE=InnoDB
服務器端設置
服務器系統變量:分全局和會話兩種
獲取系統變量 mysql> SHOW GLOBAL VARIABLES; mysql> SHOW [SESSION] VARIABLES; mysql> SELECT @@VARIABLES;
修改服務器變量的值:mysql> help SET
修改全局變量:僅對修改後新創建的會話有效;對已經建立的會話無效
mysql> SET GLOBAL system_var_name=value;
mysql> SET @@global.system_var_name=value;
修改會話變量:mysql> SET [SESSION] system_var_name=value; mysql> SET @@[session.]system_var_name=value;
服務器狀態變量: 分全局和會話兩種
狀態變量(只讀):用於保存mysqld運行中的統計數據的變量,不可更改
mysql> S:HOW GLOBAL STATUS; mysql> SHOW [SESSION] STATUS;
查詢緩存 QUERY cache:
優缺點
不需要對SQL語句做任何解析和執行,當然語法解析必須通過在先,直接從
Query Cache中獲得查詢結果,提高查詢性能
查詢緩存的判斷規則,不夠智能,也即提高了查詢緩存的使用門檻,降低其效率;
查詢緩存的使用,會增加檢查和清理Query Cache中記錄集的開銷
查詢緩存相關的服務器變量
query_cache_min_res_unit:查詢緩存中內存塊的最小分配單位,默認4k,較
小值會減少浪費,但會導致更頻繁的內存分配操作,較大值會帶來浪費,會導
致碎片過多,內存不足
query_cache_limit:單個查詢結果能緩存的最大值,默認為1M,對於查詢結
果過大而無法緩存的語句,建議使用SQL_NO_CACHE
query_cache_size:查詢緩存總共可用的內存空間;單位字節,必須是1024
的整數倍,最小值40KB,低於此值有警報
query_cache_wlock_invalidate:如果某表被其它的會話鎖定,是否仍然可以
從查詢緩存中返回結果,默認值為OFF,表示可以在表被其它會話鎖定的場景
中繼續從緩存返回數據;ON則表示不允許
query_cache_type:是否開啟緩存功能,取值為ON, OFF, DEMAND
InnoDB存儲引擎 查看狀態:show global status like ‘innodb%read%‘\G
索引:是特殊數據結構,定義在查找時作為查找條件的字段,在MySQL又稱為鍵key,索引通過存儲引擎實現
優點:索引可以降低服務需要掃描的數據量,減少了IO次數索引可以幫助服務器避免排序和使用臨時表索引可以幫助將隨機I/O轉為順序I/O 缺點:占用額外空間,影響插入
索引類型: B+ TREE、HASH、R TREE
Hash索引
Hash索引:基於哈希表實現,只有精確匹配索引中的所有列的查詢才有效,索
引自身只存儲索引列對應的哈希值和數據指針,索引結構緊湊,查詢性能好
Memory存儲引擎支持顯式hash索引,InnoDB和MyISAM存儲引擎不支持
適用場景:只支持等值比較查詢,包括=, <=>, IN()
不適合使用hash索引的場景 不適用於順序查詢:索引存儲順序的不是值的順序
不支持模糊匹配 不支持範圍查詢 不支持部分索引列匹配查找:如A,B列索引,只查詢A列索引無效
索引優化建議
只要列中含有NULL值,就最好不要在此例設置索引,復合索引如果有NULL值,
此列在使用時也不會使用索引
盡量使用短索引,如果可以,應該制定一個前綴長度
對於經常在where子句使用的列,最好設置索引
對於有多個列where或者order by子句,應該建立復合索引
對於like語句,以%或者‘-’開頭的不會使用索引,以%結尾會使用索引
盡量不要在列上進行運算(函數操作和表達式操作)
盡量不要使用not in和<>操作
並發控制
鎖粒度:表級鎖 行級鎖
鎖: 讀鎖:共享鎖,只讀不可寫(包括當前事務),多個讀互不阻塞 寫鎖:獨占鎖,排它鎖,寫鎖會阻塞其它事務(不包括當前事務)的讀和它鎖
實現 存儲引擎:自行實現其鎖策略和鎖粒度 服務器級:實現了鎖,表級鎖,用戶可顯式請求
分類: 隱式鎖:由存儲引擎自動施加鎖 顯式鎖:用戶手動請求
LOCK TABLES 加鎖 UNLOCK TABLES 解鎖
事務
事務Transactions:一組原子性的SQL語句,或一個獨立工作單元
事務日誌:記錄事務信息,實現undo,redo等故障恢復功能
啟動事務:BEGIN BEGIN WORK START TRANSACTION
結束事務:
COMMIT:提交 ROLLBACK: 回滾 註意:只有事務型存儲引擎中的DML語句方能支持此類操作
自動提交:set autocommit={1|0} 默認為1,為0時設為非自動提交
建議:顯式請求和提交事務,而不要使用“自動提交”功能
事務隔離級別
事務隔離級別:從上至下更加嚴格
READ UNCOMMITTED 可讀取到未提交數據,產生臟讀
READ COMMITTED 可讀取到提交數據,但未提交數據不可讀,產
生不可重復讀,即可讀取到多個提交數據,導致每次讀取數據不一致
REPEATABLE READ 可重復讀,多次讀取數據都一致,產生幻讀,即
讀取過程中,即使有其它提交的事務修改數據,仍只能讀取到未修改
前的舊數據。此為MySQL默認設置
SERIALIZABILE 可串行化,未提交的讀事務阻塞修改事務,或者未
提交的修改事務阻塞讀事務。導致並發性能差
MVCC: 多版本並發控制,和事務級別相關
指定事務隔離級別:
服務器變量tx_isolation指定,默認為REPEATABLE-READ,可在GLOBAL和
SESSION級進行設置
SET tx_isolation=‘‘
READ-UNCOMMITTED
READ-COMMITTED
REPEATABLE-READ
SERIALIZABLE
服務器選項中指定
vim /etc/my.cnf
[mysqld]
transaction-isolation=SERIALIZABLE
日誌
事務日誌 transaction log、錯誤日誌 error log、通用日誌 general log、慢查詢日誌 slow query log、二進制日誌 binary log、中繼日誌 reley log
錯誤日誌
錯誤日誌 mysqld啟動和關閉過程中輸出的事件信息 mysqld運行中產生的錯誤信息 event scheduler運行一個event時產生的日誌信息 在主從復制架構中的從服務器上啟動從服務器線程時產生的信息?錯誤日誌相關配置 SHOW GLOBAL VARIABLES LIKE ‘log_error‘
錯誤文件路徑 log_error=/PATH/TO/LOG_ERROR_FILE
是否記錄警告信息至錯誤日誌文件log_warnings=1|0 默認值1
通用日誌
通用日誌:記錄對數據庫的通用操作,包括錯誤的SQL語句
文件:file,默認值
表:table
通用日誌相關設置
general_log=ON|OFF
general_log_file=HOSTNAME.log
log_output=TABLE|FILE|NONE
慢查詢日誌
慢查詢日誌:記錄執行查詢時長超出指定時長的操作
slow_query_log=ON|OFF 開啟或關閉慢查詢
long_query_time=N 慢查詢的閥值,單位秒
slow_query_log_file=HOSTNAME-slow.log 慢查詢日誌文件
二進制日誌
二進制日誌 記錄導致數據改變或潛在導致數據改變的SQL語句記錄已提交的日誌不依賴於存儲引擎類型
功能:通過“重放”日誌文件中的事件來生成數據副本
註意:建議二進制日誌和數據文件分開存放
中繼日誌:relay log主從復制架構中,從服務器用於保存從主服務器的二進制日誌中讀取的事件
二進制日誌記錄三種格式
基於“語句”記錄:statement,記錄語句,默認模式
基於“行”記錄:row,記錄數據,日誌量較大
混合模式:mixed, 讓系統自行判定該基於哪種方式進行
日誌文件:mysql|mariadb-bin.文件名後綴,二進制格式 如: mariadb-bin.000001
索引文件:mysql|mariadb-bin.index,文本格式
二進制日誌相關配置
查看mariadb自行管理使用中的二進制日誌文件列表,及大小 SHOW {BINARY | MASTER} LOGS
查看使用中的二進制日誌文件 SHOW MASTER STATUS
查看二進制文件中的指定內容 示例:show binlog events in ‘mysql-bin.000001‘ from 6516 limit 2,3
mysqlbinlog:二進制日誌的客戶端命令工具
mysqlbinlog --start-position=6787 --stop-position=7527
清除指定二進制日誌:
PURGE BINARY LOGS TO ‘mariadb-bin.000003’;刪除3之前的日誌
PURGE BINARY LOGS BEFORE ‘2017-01-23‘; PURGE BINARY LOGS BEFORE ‘2017-03-22 09:25:30‘;
刪除所有二進制日誌,index文件重新記數 RESET MASTER [TO #];
刪除所有二進制日誌文件,並重新生成日誌文件,文件名從#開始記數,默認從1開始,一般是master主機第一次啟動時執行,MariaDB10.1.6開始支持TO #
切換日誌文件:FLUSH LOGS;
增量備份:僅備份最近一次完全備份或增量備份(如果存在增量)以來變化的數據,備份較快,還原復雜
差異備份:僅備份最近一次完全備份以來變化的數據,備份較慢,還原簡單
註意:二進制日誌文件不應該與數據文件放在同一磁盤
備份和恢復
mysqldump:邏輯備份工具,適用所有存儲引擎,溫備;支持完全或部分備份;對InnoDB存儲引擎支持熱備,結合binlog的增量備份
xtrabackup:由Percona提供支持對InnoDB做熱備(物理備份)的工具,支持完全備份、增量
xtrabackup:
percona提供的mysql數據庫備份工具,惟一開源的能夠對innodb和xtradb數據庫進行熱備的工具
特點:
備份還原過程快速、可靠 備份過程不會打斷正在執行的事務 能夠基於壓縮等功能節約磁盤空間和流量
自動實現備份檢驗 開源,免費
xtrabackup單表導出和導入
1 單表備份 innobackupex --include=‘hellodb.students‘ /backups
2備份表結構 mysql -e ‘show create table hellodb.students‘ > student.sql
3刪除表 mysql -e ‘drop table hellodb.students‘
4 innobackupex --apply-log --export /backups/2018-02-23_15-03-23/
5 創建表
mysql>CREATE TABLEstudents
(StuID
int(10) unsigned NOT NULL AUTO_INCREMENT,Name
varchar(50) NOT NULL,Age
tinyint(3) unsigned NOT NULL,Gender
enum(‘F‘,‘M‘) NOT NULL,ClassID
tinyint(3) unsigned DEFAULT NULL,TeacherID
int(10) unsigned DEFAULT NULL,
PRIMARY KEY (StuID
) ) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8
6 刪除表空間 alter table students discard tablespace;
7 cp /backups/2018-02-23_15-03-23/hellodb/students.{cfg,exp,ibd} /var/lib/mysql/hellodb/
8 chown -R mysql.mysql /var/lib/mysql/hellodb/
9 mysql>alter table students import tablespace;
MySQL復制
主節點配置:
(1) 啟用二進制日誌
[mysqld]
log_bin
(2) 為當前節點設置一個全局惟一的ID號
[mysqld]
server_id=#
log-basename=master 可選項,設置datadir中日誌名稱,確保不依賴主機名
(3) 創建有復制權限的用戶賬號
GRANT REPLICATION SLAVE ON . TO ‘repluser‘@‘HOST‘ IDENTIFIED BY ‘replpass‘;
從節點配置:
(1) 啟動中繼日誌
[mysqld]
server_id=# 為當前節點設置一個全局惟的ID號
read_only=ON 設置數據庫只讀
relay_log=relay-log relay log的文件路徑,默認值hostname-relay-bin
relay_log_index=relay-log.index 默認值hostname-relay-bin.index
(2) 使用有復制權限的用戶賬號連接至主服務器,並啟動復制線程
mysql> CHANGE MASTER TO MASTER_HOST=‘host‘,
MASTER_USER=‘repluser‘, MASTER_PASSWORD=‘replpass‘,
MASTER_LOG_FILE=‘ mariadb-bin.xxxxxx‘, MASTER_LOG_POS=#;
mysql> START SLAVE [IO_THREAD|SQL_THREAD];
如果要啟用級聯復制,需要在從服務器啟用以下配置
[mysqld]
log_bin
log_slave_updates
主主復制:互為主從
容易產生的問題:數據不一致;因此慎用?考慮要點:自動增長id配置一個節點使用奇數idauto_increment_offset=1 開始點auto_increment_increment=2 增長幅度另一個節點使用偶數idauto_increment_offset=2auto_increment_increment
主主復制的配置步驟:
(1) 各節點使用一個惟一server_id
(2) 都啟動binary log和relay log
(3) 創建擁有復制權限的用戶賬號
(4) 定義自動增長id字段的數值範圍各為奇偶
(5) 均把對方指定為主節點,並啟動復制線程
Galera Cluster:
Galera Cluster特點
多主架構:真正的多點讀寫的集群,在任何時候讀寫數據,都是最新的
同步復制:集群不同節點之間數據同步,沒有延遲,在數據庫掛掉之後,數據不會丟失
並發復制:從節點APPLY數據時,支持並行執行,更好的性能
故障切換:在出現數據庫故障時,因支持多點寫入,切換容易
熱插拔:在服務期間,如果數據庫掛了,只要監控程序發現的夠快,不可服務時間就會非常少。在節點故障期間,節點本身對集群的影響非常小
自動節點克隆:在新增節點,或者停機維護時,增量數據或者基礎數據不需要人工手動備份提供,Galera Cluster會自動拉取在線節點數據,最終集群會變為一致
對應用透明:集群的維護,對應用程序是透明的
MySQL重點內容:查詢語句、名稱解析