2019年3月29日 星期五

【MYSQL】INNODB與MyISAM事務及鎖

INNODB與MYISAM的最大不同有兩點

  • 支持事務ACID
  • 使用行級鎖

INNODB行級鎖模式行級鎖模式可以在同時不同線程進按索引條件進行更新,同時又有可進行查詢的使用
  • 線程中訪問不同的行時只存在少量鎖定沖突
  • 回滾時只有少量的更改
  • 可以長時間鎖定單一個行
  • 行鎖必須有索引才能實現,否則會自動鎖全表,那麼就不是行鎖了
  • 兩個事務不能鎖同一個索引,例如兩個線程都執行同一個SQL,會鎖在同一個
  • insert ,delete , update在事務中都會自動默認加上排它鎖

行鎖分共享鎖和排它鎖

共享鎖又稱讀鎖:。當一個事務對某幾行上讀鎖時,允許其他事務對這幾行進行讀操作,但不允許其進行寫操作,也不允許其他事務給這幾行上排它鎖,但允許上讀鎖。


排它鎖又稱寫鎖:。當一個事務對某幾個上寫鎖時,不允許其他事務寫,但允許讀。更不允許其他事務給這幾行上任何鎖。包括寫鎖。

例如:select age from table_name where age >60 for update

MYSQL的事務介紹:

事務的特性ACID :由一組SQL語句(交易)組成的邏輯處理單元,事務具有ACID屬性

原子性(Atomicity):事務是一個整體被執行。包含事務對數據資料的操作,要麼全部成功,要麼全部都不成功。
一致性(Consistent):事務開始到結束的時間段內,資料都必須保持一致狀態。
隔離性(Isolation):資料庫系統提供一定的隔離機制,保證事務在不受外部併發操作影響的"獨立"環境執行。

永續性(Durable):事務完成後,它對於資料的修改是永久性的,即使出現系統故障也能夠保持。

事務的隔離級別(INNODB不建議更改默認REPEATABLE-READ)

·未提交讀(Read Uncommitted):允許Dirty Read(臟讀、亂讀、錯讀),

簡單的解釋就是可能讀取到其他會話中未提交事務修改(就是其他人的事務還未結束的情形下,還可以讀到他提交)的數據

2019年3月27日 星期三

【MYSQL】不走索引的SQL

不走索引的SQL

  • like語句,'%w'不會使用索引,'w%'會使用索引
select * from table_name where name LIKE "%wang%";  -----------------不會使用索引
select * from table_name where name LIKE "wang%";  ------------------會使用索引

  • 列類型為字符串類型字符串類型指(CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM和SET),查詢時沒有用單引號引起來
select * from table_name where ship_id=20;  -----------------不會使用索引
select * from table_name where ship_id="20";  ------------------會使用索

  • 在where查詢語句中使用計算試+-*/或是!= , <> 比較
select * from table_name where id +1 = 2103;-----------------不會使用索引

  • 在where查詢語句中對字段進行NULL值判斷(is NULL 或is not NULL)
select * from table_name where group_name=NULL;  -----------------不會使用索引

  • 在where查詢中使用了or關鍵字, myisam表能用到索引, innodb不行;(用UNION替換or,可以使用索引) 
例:where中的indexed欄有建索引、no_index欄沒建索引。
select * from table_name where Indexed="20" or No_index="11";--不會使用索引(一有一沒有建)
select * from table_name where Indexed="20" or Indexed2="11";----會使用索引(兩個都有建)

  • where中組合索引未按順序查詢的index(A欄,B欄,C欄)左前綴法則
  • 但查A,C欄雖有使用到索引,效果沒有ABC來得好,因為只使用到部份索引
select * from table_name where B欄="小熊" and C欄="小Q";--不會使用索引(一定要A欄先)
select * from table_name where A欄="小胖" and C欄="小Q";----會使用索引(A欄有在第一個就可)

  • 如果mysql估計使用全表掃描要比使用索引快,則不使用索引(數據量小時or 索引數據量大於20%的
  • delete中帶in不會走索引
    (查詢table_name2中的id=20符合的,刪除在table_name的資料)
delete from table_name where id in(select id from table_name2 where id=20);--不會使用索引
delete table_name from table_name inner join table_name2 on 
table_name.id=table_name2.id where table_name2=20;--------會使用索引

2019年3月26日 星期二

【MYSQL】5.6版本升至5.7,版本共存


舊版原本my.cnf的設置

basedir = /usr/local/mysql (安裝MYSQL服務的路徑)
datadir = /data/mysql (存放DB資料庫的路徑)

第一步:先下載mysql5.7版本

[root@rosalie~]# wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.18- linux-glibc2.5-x86_64.tar.gzb

第二步:將下載的檔案,解壓並移動至/usr/local/下(-C指定直接移動到安裝的路徑)

[root@rosalie~]# tar zxvf mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz -C /usr/local/


2019年3月22日 星期五

【MYSQL】索引種類與說明

索引可以提高查詢的速度,對於常常查詢的欄位使用索引,有無設定的速度差可能會好幾倍。所以
範例1~例如:若資料上萬筆
SELECT * FROM table_name where datetime>= '2019-03-22 00:00:00'
AND datetime <= '2019-03-22 23:59:59';
如果在datetime欄位加上索引,和一個沒加索引若資料量龐大,兩個查詢的速度會差很多!
加上索引的,MYSQL會優先針對datetime去查詢,沒加索引的表,則是會全文搜尋。


索引(index)的類型


1.主鍵索引(primary key)。
語法:ALTER TABLE table_name ADD primary key (column) ;

  • 不能為NULL
  • 不能重覆
  • 一個表只能有一個主鍵索引。
例如:用於,自動編號、身份證字號....等

2.唯一索引(unique index)。

語法:ALTER TABLE table_name ADD unique (column) ;
或CREATE UNIQUE INDEX index_name ON table_name(column);

  • 可以為NULL 
  • 不能重覆
例如:像是手機有號碼,E-MAIL....等,有些人不一定有手機或E-MAIL

3.一般索引、普通索引。

語法:(填加或直接創建)ALTER TABLE table_name ADD INDEX index_name (column) ;
或CREATE INDEX index_name ON table_name (column);
  • 最基本的索引,無任何限制

4.組合索引
語法:ALTER TABLE table_name ADD INDEX index_name(column1, column2, column3);
  • 組合索引中最左邊的欄位column1一定要出現在條件中,才會使用索引

例如:以下兩個查詢會用到索引
SELECT * FROM table_name WHERE column1=val1;
SELECT * FROM table_name WHERE column1=val1 AND column2=val2;
以下兩個查詢不會用到索引,請注意條件中 column2並非索引的第一個欄位
SELECT * FROM tbl_name WHERE column2=val2;
SELECT * FROM tbl_name WHERE column2=val2 AND column3=val3;

5.全文索引。
語法:ALTER TABLE table_name ADD FULLTEXT (column);
或CREATE FULLTEXT INDEX index_name ON table_name(column);

查看索引,可以用三種方法:
SHOW {INDEX | INDEXES | KEYS} from table_name;

或是查看資料庫內的索引:
SHOW {INDEX | INDEXES | KEYS} from database_name;

或是針對表查看進行管理:

show create table 表名\G


刪除索引:
DROP INDEX index_name ON table_name;

特殊案例
測試EXPLAIN - 效能分析語句
在SELECT 前加入EXPLAIN 可以查出語句的執行效能
以下為例當我在ID上加上索引,實際查詢where id=20067,查詢時間很快


mysql> select id from users where id = 20067;
+-------+
| id    |
+-------+
| 20067 |
+-------+
1 row in set (0.00 sec)

mysql> explain select id,loginname from users where id = 20067;
+----+-------------+-------+------+---------------+------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref   | rows | Extra       |
+----+-------------+-------+------+---------------+------+---------+-------+------+-------------+
|  1 | SIMPLE      | users | ref  | id            | id   | 4       | const |    1 | Using index |
+----+-------------+-------+------+---------------+------+---------+-------+------+-------------+
1 row in set (0.00 sec)
注意ID+1,其實都是查同一筆資料,但索引未產生效用MYSQL無法解析程式
mysql> select id from users where id +1 = 20068;
+-------+
| id    |
+-------+
| 20067 |
+-------+
1 row in set (0.88 sec)

mysql> explain select id,loginname from users where id +1 = 20068;
+----+-------------+-------+-------+---------------+------+---------+------+--------+--------------------------+
| id | select_type | table | type  | possible_keys | key  | key_len | ref  | rows   | Extra                    |
+----+-------------+-------+-------+---------------+------+---------+------+--------+--------------------------+
|  1 | SIMPLE      | users | index | NULL          | id   | 4       | NULL | 576128 | Using where; Using index |
+----+-------------+-------+-------+---------------+------+---------+------+--------+--------------------------+
1 row in set (0.00 sec)

2019年3月21日 星期四

【MySQL】SHOW TABLE STATUS 指令說明


列出資料表的相關資訊—
查詢語法可用
針對整個DB下所有的表
show table status \G        
show table status from db_name  \G; 
針對特定表
show table status like "tableName" \G
show table status from db_crm_catalog like "tableName" \G;
*************************** 1. row ***************************
           Name: users                
         Engine: MyISAM                   
        Version: 10                       
     Row_format: Dynamic                  
           Rows: 15                
 Avg_row_length: 214
    Data_length: 3220
Max_data_length: 281474976710655
   Index_length: 9216
      Data_free: 0
 Auto_increment: 16
    Create_time: 2018-07-20 11:47:17
    Update_time: 2018-12-03 11:37:26
     Check_time: 2018-12-03 11:37:26
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options: 
        Comment: 
1 row in set (0.00 sec)
Name:---表名。
Engine---表的存儲引擎。
Version---版本。
Row_format---行格式。對於MyISAM引擎,值可能是1.Dynamic(動態行)--行長度可變,例如Varchar或Blob類型字段。2.Fixed(固定行)--是指行長度不變,例如Char和Integer類型字段。3.Compressed(壓縮行)--只存在壓縮表中,壓縮表指表在創建並導入數據以後,不再進行修改操作使用myisampack對MYISAM表進行壓縮,壓縮表無法進行修改,若要修改需先解除壓縮,再修改,然後再次進行壓縮,可減少硬碟的空間,也可減少I/O從而提升查詢性能,壓縮表也支持索引,只能讀。
Rows---表中的行數。對於MYISAM非事務性表,這個值是精確的,對於InnoDB事務性引擎,這個值通常是估算的。
Avg_row_length:---平均每行包括的字節數 。
Data_length:---整個表的數據量大小(單位:字節)
Max_data_length:---表可以容納的最大數據量,該值和存儲引擎有關。
Index_length:---索引佔用硬碟的空間大小。(單位:字節)
Data_free:---對於MyISAM引擎,表示已分配,但目前沒有使用的空間,這空間包含了已被刪除的行,以及後續可被INSERT利用到的空間。
Auto_increment:---下一個Auto_increment的值。
Create_time:---表的創建時間。
Update_time:---表的最近更新時間。
Check_time:---使用check table 或myisamchk工具檢查表的最近時間。
Collat​​ion:---表的默認字符集和字符排序規則。
Checksum:---如果啟用,則對整個表的內容計算時的校驗和。
Create_options:---指表創建時的其他所有選項。
Comment:---註解包含了其他額外信息,對於MyISAM引擎,包含了創建時的註釋,對於innodb引擎,將保存的剩餘空間。如果是一個視圖,註解裡面包含了VIEW字樣。

2019年3月20日 星期三

【MYSQL】數據庫目錄下的文件說明


數據庫目錄下的文件說明

[root@224-slave data]# ll
total 22-----
-rw-rw----. 1 mysql mysql        745 Mar 20 11:34 224-slave.log
-rw-rw----. 1 mysql mysql          5 Mar  7 14:52 224-slave.pid 
-rw-rw----. 1 mysql mysql         56 Mar  7 14:49 auto.cnf        
-rw-rw----. 1 mysql mysql    2502570 Mar  7 14:52 error.log       
-rw-r-----. 1 mysql mysql   79691776 Mar 20 11:31 ibdata1
-rw-rw----. 1 mysql mysql   50331648 Mar 20 11:31 ib_logfile0
-rw-rw----. 1 mysql mysql 1073741824 Mar  7 14:25 ib_logfile01
-rw-rw----. 1 mysql mysql 1073741824 Mar  7 14:26 ib_logfile02
-rw-rw----. 1 mysql mysql   50331648 Mar  7 15:19 ib_logfile1
drwxr-x---. 2 mysql mysql      20480 Feb 17 00:32 ibtmp1
drwxr-x---. 2 mysql mysql       4096 Feb 17 00:32 book
drwxr-x---. 2 mysql mysql       4096 Feb 17 00:32 dbdbdb
drwxr-x---. 2 mysql mysql       4096 Feb 17 00:32 mysql
-rw-rw----. 1 mysql mysql        285 Mar  7 14:52 mysql-bin.000001
-rw-rw----. 1 mysql mysql   80326560 Mar 20 11:55 mysql-bin.000002
-rw-rw----. 1 mysql mysql         58 Mar  7 14:52 mysql-bin.index
drwxr-x---. 2 mysql mysql       4096 Feb 17 00:32 performance_schema
drwxr-x---. 2 mysql mysql      16384 Mar  7 14:53 test2
drwxr-x---. 2 mysql mysql       4096 Mar 20 11:31 test
-rw-r-----. 1 mysql mysql         24 Feb 17 00:32 xtrabackup_binlog_info
-rw-r--r--. 1 root  root          24 Mar  7 14:49 xtrabackup_binlog_pos_innodb
-rw-r-----. 1 mysql mysql        119 Mar  7 14:49 xtrabackup_checkpoints
-rw-r-----. 1 mysql mysql        519 Feb 17 00:32 xtrabackup_info
-rw-r-----. 1 mysql mysql    9437184 Mar  7 14:49 xtrabackup_logfile
-rw-r--r--. 1 root  root           1 Mar  7 14:49 xtrabackup_master_key_id
224-slave.log ※通用日志文件

224-slave.pid ※記錄mysqld進程的id,用於鎖

auto.cnf ※記錄mysql數據庫實例的server_uuid,安裝的時候初始化,master和slave的server_uuid不能一樣  

error.log ※錯誤日誌文件

ibdata1  ※innodb表空間,如果採用innodb引擎,會默認10M大小

innodb_file_per_table 設置為1,數據表將各自存一個文件又稱獨立表空間

innodb_file_per_table 設置為0,默認值,數據表統一存放一個共享表空間

ib_logfile0ib_logfile1 ※事務日誌文件,是確保事務的REDO和UNDO,主要是確保事務的前滾和後滾,不是用來恢復用
innodb_data_file_path 設置日志大小
設至兩個範例→innodb_data_file_path=ibdata1:5000M;ibdata2:5000M:autoextend
autoextend屬性的表空間文件每次加大多少兆字節(默認設置是8MB)

ibtmp1 ※臨時表空間
book ※book數據庫目錄
dbdbdb ※dbdbdb數據庫目錄
mysql ※mysql系統數據庫目錄
mysql-bin.000001  二進制日誌文件,用於恢復,主從數據同步等
mysql-bin.000002   二進制日誌文件,用於恢復,主從數據同步等
mysql-bin.index    二進制日誌文件索引,存放二進制日誌文件列表
performance_schema performance_schema系統數據庫目錄
test  test數據庫目錄
------------------------------------------------------------------------------------------------------------
*以下是用xtrabackup復原後會生成的檔案
xtrabackup_binlog_info    
※mysql服務器當前正在使用的二進制日誌文件及至備份這一刻為止二進制日誌事件的位置。
xtrabackup_binlog_pos_innodb 
※記錄binlog_pos的位置記錄
xtrabackup_checkpoints
※文件記錄的是備份類型,如是全量備份還是增量,當前備份集的狀態,是否已經prepare過。如果是全量備份,backup_type = full-backuped,如果是增量是backup_type = incremental。
xtrabackup_info 
※文件記錄的是你備份的時候的一些參數,腳本版本,數據庫版本,備份時間,binlog,是否壓縮,備份增量還是全量等信息
xtrabackup_logfile
※這個文件相當的重要,這個文件記錄的是從備份開始到備份結束所有的redo日誌,xtrabackup在apply log的時候需要讀取該文件,進行redo前滾。
xtrabackup_master_key_id
※有主從才會產生的文件



[root@224-slave performance_schema ]# ll
-rw-r-----. 1 mysql mysql  8706 Feb 17 00:32 accounts.frm
-rw-r-----. 1 mysql mysql  8624 Feb 17 00:32 cond_instances.frm
-rw-r-----. 1 mysql mysql    61 Feb 17 00:32 db.opt    
-rw-r-----. 1 mysql mysql  8991 Feb 17 00:32 events_stages_current.frm
-rw-r-----. 1 mysql mysql  8991 Feb 17 00:32 events_stages_history.frm
[root@224-slave mysql ]# ll
-rw-r-----. 1 mysql mysql    8820 Feb 17 00:32 columns_priv.frm
-rw-r-----. 1 mysql mysql       0 Feb 17 00:32 columns_priv.MYD
-rw-r-----. 1 mysql mysql    4096 Feb 17 00:32 columns_priv.MYI
-rw-r-----. 1 mysql mysql    9582 Feb 17 00:32 db.frm
-rw-r-----. 1 mysql mysql   15400 Feb 17 00:32 db.MYD
-rw-r-----. 1 mysql mysql    5120 Feb 17 00:32 db.MYI
-rw-r-----. 1 mysql mysql    8686 Feb 17 00:32 readed.frm
-rw-r-----. 1 mysql mysql  638976 Feb 17 00:30 readed.ibd
  • db.opt        數據庫的結構定義和設置
  • *.frm         數據表的結構定義
  • *.MYD      MYISAM表數據,MYISAM表才有
  • *.MYI        MYISAM索引數據,MYISAM表才有
  • *.idb           InnoDB 數據和索引
  • *.trg            觸發器

【MYSQL】日志種類及說明


錯誤日志:
參數路徑設定:log-error = [file_name]
若無設定[file_name],mysql將使用錯誤日志名host_name.err來命名

  • mysql啟動或停止
  • 服務器運行過程中任何嚴重的錯誤訊息
通用日志:
參數路徑設定:log = [file_name] 或 -l  [file_name] 
若無設定[file_name],mysql將默認名host_name.log命名
  • 所有連接和語句都會被記錄到日志文件中
190320 11:30:41 1040 Query show databases
190320 11:30:48 1040 Query SELECT DATABASE()
1040 Init DB test
1040 Query show databases
1040 Query show tables
1040 Field List modules 
190320 11:30:50 1040 Query show tables
190320 11:31:04 1040 Query select * from modules
190320 11:31:32 1040 Query drop table modules
190320 11:31:34 1040 Quit

**可查詢客戶端的執行SQL語句,但通用日志開啟後,可能在短短幾小時就塞爆硬碟空間 ,亦會影響性能。

二進制日志:
參數路徑設定:log-bin = [file_name] 
參數設定二進制日志的大小:max_binlog_size = [file_size]
達到設定大小後,會自行切換新的二進制檔案。mysql-bin.000001即切換至mysql-bin.000002
  • 包含更新數據或已經潛在的更新數據的語句,語句以事件的形式保存。
  • 包含每個更新數據執行的時間,不包含未修改語句的部份!
  • 用於恢復數據之用。
  • 記錄形式分:statement(語句級)、row(行級)、mixed(混合型)
# at 80326418 事件的起始點
#190307 14:50:40 server id 1  end_log_pos 80326560 CRC32 0xc2452c35  Query thread_id=2 exec_time=1112676    error_code=0 
/*語句執行的時間 end_log_pos是下個記錄的起始點,也就是上個事件的終點*/
/*thread_id指執行SQL線程的ID
exec_time在主從庫有不同的含義,主指執行所花費的時間;在從則指這事件結束時間再減去主庫上開始執行的時間,差異同滯後程度。error_code為錯誤狀況0表示正常。*/
SET TIMESTAMP=1551941440/*!*/;
SET PASSWORD FOR 'root'@'localhost'='*A4B6157319038724E3560894F7F932C8886EBFCF'
/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
慢日志:
參數路徑設定:log-slow-queries = [file_name]
若無設定[file_name],mysql將使用錯誤日志名slow.log來命名
參數設定慢查詢時間:slow_query_log = 1 指超過一秒的的SQL將寫入慢日志內。

2019年3月18日 星期一

【MYSQL】執行SQL的文件方式


執行SQL的文件方式如下,
若是大量的指令非常好用

範例 :
db_name:test
SQL文件路徑:/root/test.sql
文件檔內容:
create table BBB
(Guid Varchar(38) not null primary key,
  Title Varchar(255));

※use db_ name;這個很重要!!
可以導入SQL文件時指定,或是在文件檔上直接加一條指令)
如果未指定會出現錯誤訊息
ERROR 1046 (3D000) at line 1: No database selected

 #方法一:在MYSQL內執行

mysql> use test; 

mysql> source /root/test.sql   

Database changed
Query OK, 0 rows affected (0.01 sec)

#方法二在LINUX下執行  * -vvv 是顯示執行結果   test 是指定的DB

mysql -uroot -p -vvv test < /root/test.sql    

Enter password: 
--------------
create table BBB
(Guid Varchar(38) not null primary key,  
  Title Varchar(255)
)
--------------

Query OK, 0 rows affected (0.08 sec)

2019年3月15日 星期五

【MYSQL】兩主一從設置

首先先將MASTER及SLAVE的 my.cnf設定完好

A機-192.168.1.1-MASTER
B機-192.168.1.2-是A機的SALVE-亦是C機的MASTER
C機-192.168.1.3-是B機的SALVE (因為是B機SLAVE,所以存在著A機的資料庫)

第一步 ,先設定MASTER
#MASTER設定-A機-192.168.1.1-MASTER
[mysqld]
server-id         =11
user             = mysql
bind-address   =192.168.1.1
datadir            =/usr/local/mysql/data
basedir            = /usr/local/mysql
socket             =/tmp/mysql.sock
binlog-format = mixed
log-bin            =mysql-bin
port                 = 3306

設定好my.cnf重啟DB
mysql>service mysql restart
MASTER-A機-192.168.1.1
mysql>create user 'mysql'@'192.168.1.2' identified by '1234';
mysql>grant replication slave on *.* to 'mysql'@'192.168.1.2' identified by '1234';
mysql>flush privileges;
1。建立MYSQL用戶,允許從192.168.1.2連入。
2。給予MYSQL複製SLAVE的權限
3。套用更新

再輸入指令show master status;
參數中顯示的序號及POSITION是稍等要設定SLAVE時會用到
mysql>show master status;
+----------------------+----------+--------------------+-----------------------+-------------------------+
| File                     | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+----------------------+----------+--------------------+-----------------------+-------------------------+
| mysql-bin.000001 |      1564|                             | mysql                     |                                  |
+----------------------+----------+--------------------+-----------------------+-------------------------+
1 row in set (0.00 sec)

第二步 ,設定SLAVE
SLAVE設定(先以SLAVE狀能設定,之後啟動主從後,再SHOW成MASTER,給第三台作為MASTER)
#SLAVE設定-B機-192.168.1.2
[mysqld]
  server-id         =22
  user             = mysql
  datadir            =  /usr/local/mysql/data
  basedir           =  /usr/local/mysql
  socket             = /tmp/mysql.sock
  binlog-format = mixed  
  log-bin            =mysql-bin
  relay-log      =mysql-relay-bin  

設定好my.cnf重啟DB
mysql> service mysql restart
 SLAVE設定-B機-192.168.1.2  
mysql> change master to master_host='192.168.1.1', master_user='mysql', master_password='1234', master_port=3306, master_log_file='mysql-bin.000001', master_log_pos=1564;

   mysql> start slave;

   #查看SALVE狀態
   mysql>  show slave status \G 

   Slave_IO_Running: Yes
   Slave_SQL_Running:Yes

   #表示連線成功設定完成

 
第三步 ,在原本的B機SALVE繼續設定
mysql> create user 'mysql'@'192.168.1.3' identified by '1234';
mysql> grant replication slave on *.* to 'mysql'@'192.168.1.3' identified by '1234';
mysql> flush privileges;
mysql>show master status;
+----------------------+----------+--------------------+-----------------------+-------------------------+
| File                     | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set  |
+----------------------+----------+--------------------+-----------------------+-------------------------+
| mysql-bin.000001 |      2299 |                             | mysql                     |                                  |
+----------------------+----------+--------------------+-----------------------+-------------------------+
1 row in set (0.00 sec)

1。建立MYSQL用戶,允許從192.168.1.3連入。
2。給予MYSQL複製SLAVE的權限
3。套用更新
。show master status 此數據將由C機取用

第四步
#SLAVE設定-C機-192.168.1.3
[mysqld]
  server-id         =33
  user             = mysql
  datadir            =  /usr/local/mysql/data
  basedir            =  /usr/local/mysql
  socket             = /tmp/mysql.sock
  binlog-format = mixed  
  log-bin            =mysql-bin
  relay-log         =mysql-relay-bin

設定好my.cnf重啟DB
mysql> service mysql restart
SLAVE設定-C機-192.168.1.3
     
   mysql> change master to
              master_host='192.168.1.2,
              master_user='mysql',
              master_password='1234',
              master_port=3306,
              master_log_file='mysql-bin.000001,
              master_log_pos=2299;
   mysql> start slave;
   
   #查看SALVE狀態
   mysql>  show slave status \G 

   Slave_IO_Running: Yes
   Slave_SQL_Running:Yes

   #表示連線成功設定完成


最後完成後再B機上查看show processlist;
則會出現一組master及一組slave的連線

mysql> SHOW PROCESSLIST;
+----+-------------+---------------------+------+-------------+------+----------------------------------------------------+------------------+
| Id | User            | Host                | db   | Command     | Time | State                                                         | Info             |
+----+-------------+---------------------+------+-------------+------+---------------------------------------------------+------------------+
|  2 | root            | localhost           | bbb  | Query       |    0 | starting                                                      | show processlist |
|  9 | system user |                     | NULL | Connect     | 2372 | Waiting for master to send event                              | NULL             |
| 10 | system user |                     | NULL | Connect     |   39 | Slave has read all relay log; waiting for more updates        | NULL             |
| 11 | root            | 192.168.1.1:48688 | NULL | Binlog Dump |  636 | Master has sent all binlog to slave; waiting for more updates | NULL             |
+----+-------------+---------------------+------+-------------+------+----------------------------------------------------+------------------+
4 rows in set (0.00 sec)

【LINUX】指令符號說明及SHELL特殊符號


LINUX 指令符號說明
符號
說明
1.檔名的『檔案類型』判斷,如 test -e filename 表示存在否
-e
『檔名』是否存在?(常用)
-f
『檔名』是否存在且為檔案(file)(常用)
-d
『檔名』是否存在且為目錄(directory)(常用)
-b
『檔名』是否存在且為一個 block device 裝置?
-c
『檔名』是否存在且為一個 character device 裝置?
-S
『檔名』是否存在且為一個 Socket 檔案?
-p
『檔名』是否存在且為一個 FIFO (pipe) 檔案?
-L
『檔名』是否存在且為一個連結檔?
2.檔案的判斷偵測,如 test -r filename 表示可讀否 ( root 權限常有例外)
-r
偵測該檔名是否存在且具有『可讀』的權限?
-w
偵測該檔名是否存在且具有『可寫』的權限?
-x
偵測該檔名是否存在且具有『可執行』的權限?
-u
偵測該檔名是否存在且具有『SUID』的屬性?
-g
偵測該檔名是否存在且具有『SGID』的屬性?
-k
偵測該檔名是否存在且具有『Sticky bit』的屬性?
-s
偵測該檔名是否存在且為『非空白檔案』?
3. 兩個檔案之間的比較,如: test file1 -nt file2
-nt
(newer than)判斷 file1 是否比 file2
-ot
(older than)判斷 file1 是否比 file2
-ef

判斷 file1 file2 是否為同一檔案,可用在判斷 hard link 的判定上。 主要意義在判定,兩個檔案是否均指向同一個 inode 哩!
4. 數字比較,例如 test n1 -eq n2
-eq
兩數值相等 (equal)
-ne
兩數值不等 (not equal)
-gt
n1 大於 n2 (greater than)
-lt
n1 小於 n2 (less than)
-ge
n1 大於等於 n2 (greater than or equal)
-le
n1 小於等於 n2 (less than or equal)
5. 判定字串的資料
-z 字串
判定字串是否為 0 ?若 字串 為空,則為 true
-n字串

判定字串是否非為 0 ?若 字串 為空,則為 false
註: -n 亦可省略
str1 == str2
判定 str1 是否等於 str2 ,若相等,則回傳 true
str1 != str2
判定 str1 是否不等於 str2 ,若相等,則回傳 false
6. 多重條件判定,例如: test -r filename -a -x filename
-a

(and)兩狀況同時成立!例如 test -r file -a -x file,則 file 同時具有 r x 權限時,才回傳 true
-o

(or)兩狀況任何一個成立!例如 test -r file -o -x file,則 file 具有 r x 權限時,就可回傳 true
!
反相狀態,如 test ! -x file ,當 file 不具有 x 時,回傳 true

SHELL特殊符號
#

註釋符號作為註釋使用,在一行中,#後面的內容並不會被執行。
用單/雙引號包圍時,#作為#號字元本身,不具有註釋作用。
;

分隔符,多個語句放在同一行時,可使用分號隔。亦可連續指令
tail aaa.txt; tail bbb.txt 查看aaabbb文件的後幾行
;;

連續分號在使用case選項的時候,作為每個選項的終結符。在Bash version 4+ 的時候,還可以使用[;;&], [;&]

.

一個點代表當前目錄,兩個點號代表上層目錄,在當前目錄;linux中隱藏文件名的開頭ls -a 可以顯示);正則表達式中的任意一個字符;加載一個文件內容
"

雙引號,部分引用。雙引號包圍的內容可以允許變量擴展,也允許轉義字元的存在。(雙引號內可保有變數的特性,單引號僅為一般字元)

'

單引號括住的內容,被視為單一字串,引號內的禁止變量擴展,所有字元均作為字元本身處理(除單引號本身之外),單引號必須成對出現。

,

逗號可用在連接一連串的數學表達式中;用於變數,允許從$ variable中提取任意數量的逗號分隔值;用於參數替代中,表示首字母小寫,如果是兩個逗號,則表示全部小寫

\

反斜桿轉義,保護元字符或通配符不被shell解析 ;放在一行指令的最後一行,其實也就是轉義了Enter,表示之後的輸入仍作為當前指令的一部分。(指令太長換行的意思)
/

作為路徑的分隔符,路徑中僅有一個斜桿表示根目錄,以斜桿開頭的路徑表示從根目錄開始的路徑;另也作為運算符除法。如6/2
`

反引號,後引號。命令替換。這個引號包圍的為命令,可以執行包圍的命令,並將執行的結果賦值給變量。用來引用命令 相當於$()

:

冒號空命令,這個命令什麼都不做,但是有返回值0(即:true)。可做while死循環的條件;在if分支中作為佔位元符(即某一分支什麼都不做的時候);放在必須要有兩元操作的地方作為分隔符號

!

感嘆號,。表示反邏輯,比如後面的!= ,這個是表示不等於;表示取反,如:ls a[!0-9] #表示a後面不是緊0-9!命令 執行之前執行過的命令!+數字 執行history中對應數字的命令。
*

作為檔案名一個萬用字元;正則表達式中可以作為字元限定詞,表示其前面的匹配規則匹配任意次;算術運算中表示乘法。
**
雙星號。算術運算中表示求冪運算。

?

問號表示條件測試;參數替換達式中用來測試一個變量是否設置了值;作為萬用字元,用於匹配單個字元; 正則表達式中,表示重覆前面字符0次或者1次。
$

美元符號。前面已經表示過一種意思。作為變量的前導符;在正則表達式中被定義為行末最後字節。
${}

美元符號加上大括號,即大括號中放變數的名稱,也是用於讀取變數的值

$'...'

引用內容展開,執行單引號內的轉義內容(單引號原本是原樣引用的),這種方式會將引號內的一個或者多個[\]轉義後的八進制,十六進制值展開到ASCIIUnicode字元。

$?

此變量值在使用的時候,返回的是最後一個命令、函數、或腳本的退出狀態碼值,如果沒有錯誤則是0,如果為非0,則表示在此之前的最後一次執行有錯誤。


$*, $@

位置參數,使用腳本時,在傳遞參數時會用到。兩者都能返回調用腳本檔的參數,但$*是將所有參數作為一個整體返回(字串),而$@是將每個參數作為單元返回一個參數列表。注意,在使用的時候需要用雙引號將$*,$@括住。
$$
進程ID變量,這個變量保存了運行當前腳本的進程ID值。



()


圓括號命令組。命令組中的命令在shellsubshel​​l)中執行。因為是在子shell內運行,因此在括號外面是沒有辦法獲取括號內變量的值,但反過來,命令組內是可以獲取到外面的值,這點有點像局部變量和全域變量的關係,在實作中,如果碰到要cd到子目錄操作,並在操作完成後要返回到當前目錄的時候,可以考慮使用subshel​​l來處理;用於數組的初始化。
{AA,BB,CC,...}
花括號擴展。{a,c,h} 表示 a c h,而{a..z}表示az

{}


代碼塊。匿名函數,與函數不同,在代碼塊裡面的變量在代碼塊後面仍能訪問。注意:花括號內側需要有空格與語句分隔。另外,在xargs -i中的話,還可以作為文本的佔位元符,用以標記輸出文本的位置。

{} \;


這個{}是表示路徑名,這個並不是shell內建的,現在接觸到的情況看,好像只用在find命令裡。注意後面的分號,這個是結束find命令中-exec選項的命令序列,在實際使用的時候,要轉義一下以免被shell理解錯誤。


[]


中括號測試的表示,Shell會測試在[]內的表達式,需要注意的是,[]是Shell內建的測試的一部分,而非使用外部命令/usr/bin/test的鏈接;在數組的上下文中,表示數組元素,方括號內填上數組元素的位置就能獲得對應位置的內容;表示字元集的範圍,在正表達式中,方括號表示該位置可以匹配的字元集範圍。



[[]]



雙中括號。這個結構也是測試,測試[[]]之中的表達式(Shell的關鍵字)。這個比單中括號更能防止腳本裡面的邏輯錯誤,比如:&&,||,<,>操作符能在一個[[]]裡面測試通過,但是在[]卻不能通過。[[]]裡面沒有檔案名擴展(filename expansion)或是詞分隔符號(Word splitting),但是可以用參數擴展(Parameter expansion)和命令替換(command substitution)。不用檔案名萬用字元和像空白這樣的分隔符號。注意,這裡面如果出現了八進制,十六進制等,shell會自動執行轉換比較。
$[...]
詞表達表示整數擴展,在方括號裡面執行整數表達式


(())


雙括號(double parentheses)。表示整數擴展(integer expansion)。功能和上面的$[]差不多,但是需要注意的是,$[]是會返回裡面表達式的值的,而(())只是執行,並不會返回值。兩者執行後如果變量值發生變化,都會影響到後繼代碼的運行。可對變量賦值,可以對變量進行一目操作符操作,也可以是二目,三目操作符。




>,&<,>&,>>,<,<>



# testA > testB 重定向testA的輸出到test中,如果檔存在則覆蓋。
# testA &> testB 會重定向testA的標準輸出(stdout)和標準錯誤(stderr)到文件testB中。
# testA >&2 把testA的標準輸出(stdout)重定向到標準錯誤(stderr)中。
# testA >>testB 把testA的輸出追加到testB中,如果檔不存在則創建。
# [i]<>testA
打開testA這個檔用來讀或者寫,並且給檔指定i為它的檔描述符(file descriptor),檔不存在就會創建。



(command)>,
<(command)




這是進程替換。使用時注意,括號和<,>之間是不能有空格的,否則報錯。其作用有點類似通道,但和管道()在用法上又有些不同,管道是作為子進程的方式來運行的,這個命令會在/dev/fd/下面產生,類似/dev/fd/63, /dev/fd/62這類臨時文件,用來傳遞數據。Mitchell個人猜測之所以用這種方法來傳遞,是因為前後兩個不屬於同一個進程,因此需要用共用檔的方式來傳遞資料(這麼說其實管道也應該有同樣的文件?)。網上有人說這個只是共用檔而已,但是經過測試,發現雖然有/dev/fd/63這樣的檔產生,但是這個檔其實是指向pipe:[43434]這樣的通道的鏈接。



<<


雙小於號。用來將後繼的內容重定向到左側命令的輸入中。<<可以節省格式化時間,別且使命令執行的處理更容易。在實作的時候只需要輸入<<和終止標誌符,而後(一般是回車後)你就可以輸入任何內容,只要在最後的新行中輸入終止標誌符,即可完成數據的導入。使用here-document的時候,你可以保留空格,換行等。如果要讓shell腳本更整潔一點,可以在<<和終止符之間放上一個連字元(-)

<<<

三個小於號(here-strings)Here-字串和Here-document類似,here-strings語法:command [args] <<<["]$word["]$word會展開並作為command(命令)的輸入。

\<...\>

詞界符。這個是用在正則表達式中的一個特殊分隔符號,用來標記單詞的分界。比如:the會匹配thereanotherthem等等,如果僅僅要匹配the,就可以使用這個詞界符,\<the\>就只能匹配the了。

|

管道。管道是LinuxUnix都有的概念,是非常基礎,也是非常重要的一個概念。它的作用是將|(左邊)命令的輸出作為後(右邊)的命令的輸入()。如:ls | grep all

>|

與號。如果命令後面跟上一個&符號,這個命令將會在後台運行。有的時候,腳本中在一條在後台運行的命令可能會引起腳本掛起,等待輸入,出現這種情況可以在原有的腳本後面使用wait命令來修復。

&&,||

邏輯操作符(logical operator)。在測試結構中,可以用這兩個操作符來進行連接兩個邏輯值。||是當測試條件有一個為真時返回0(真),全假為假;&&是當測試條件兩個都為真時返回真(0),有假為假。



-



運算式中,表示"減法"。expr 10 - 2  ;此外也是系統指令的選項符號。
ls -expr 10 - 2 ;在GNU指令中,如果單獨使用-符號,不加任何該加的文件名稱時,代表"標準輸入"的意思。這是GNU指令的共通選項。譬如下例tar xpvf - 這裡的-符號,既代表從標準輸入讀取資料。
不過,在cd指令中則比較特別   cd -  這代表變更工作目錄到"上一次"工作目錄。

=

等號。賦值操作,給變量賦值,麼有空格在等號兩側; 在比較測試中作為比較符出現,這裡要注意,如果在中括號中作為比較出現,需要有空白字元在等號左右兩側。


+

加號。算術操作符,表示加法 在正則表達式中,表示的是其前的這個匹配規則匹配最少一次 在命令或過濾器中作為選項標記,在某些命令或者內置命令中使用+來啟用某些選項,使用-來禁止; 在參數替換中,+前綴表示替代值(當變量為空的時候,使用+後面的值)
%

百分號。在算術運算中,就是百分比;在參數替換中,可以作為模式匹配。

~

波浪號,這個和內部變量$HOME是一樣的。默認表示當前用戶的家目錄(主目錄),這個和~/效果一致,如果波浪號後面跟用戶名,表示是該用戶的家目錄,
~+
當前的工作目錄。這個和內置變量$PWD一樣。
~-

前一個工作目錄。這個和內部變量$OLDPWD一致,之前的[-]也一樣。



=~


Bash 版本3中有介紹,這個是正則表達式匹配。可用在[[]]測試中,比如:
var="this is a test message."
[[ "$var" =~ tf*message ]] && echo "Sir. Found that." || echo "Sorry Sir. No match be found."
##你可以修改中間的正則表達式匹配項,正則表達式可以但不一定需要使用雙引號括起來。

^

脫字元。 在正則表達式中,作為一行的行首位置標誌符;在參數替換中,這個用法有兩種,一個脫字元( ${var^}),或兩個( ${var^^}),分別表示第一個字母大寫,全部大寫的意思(Bash version >=4)。


空白



空白符。不僅僅是指空格,還包括製表符,空行,或者這幾種的組合。可用做函數的分隔符號,分隔命令或變量,空行不會影響腳本的行為,因此可以用它來規劃腳本代碼,以增加可讀性,在內置的特殊變量$IFS可以用來針對某些命令進行輸入的參數進行分割,其默認就是空白符。在字串或變量中如果有空白符,可以使用引號來規避可能的錯誤。