2019年1月23日 星期三

Linux process 資源使用查詢

cat /proc/[pid]/limits

本process的資源限制設定

Limit                     Soft Limit           Hard Limit           Units     
Max cpu time              unlimited            unlimited            seconds   
Max file size             unlimited            unlimited            bytes     
Max data size             unlimited            unlimited            bytes     
Max stack size            8388608              unlimited            bytes     
Max core file size        0                    unlimited            bytes     
Max resident set          unlimited            unlimited            bytes     
Max processes             31204                31204                processes 
Max open files            1024                 4096                 files     
Max locked memory         65536                65536                bytes     
Max address space         unlimited            unlimited            bytes     
Max file locks            unlimited            unlimited            locks     
Max pending signals       31204                31204                signals   
Max msgqueue size         819200               819200               bytes     
Max nice priority         0                    0                    
Max realtime priority     0                    0                    
Max realtime timeout      unlimited            unlimited            us 

cat /proc/[pid]/statm

180024 1241 1046 35 0 171703 0

Size (pages) 任务虚拟地址空间的大小 VmSize/4
Resident(pages) 应用程序正在使用的物理内存的大小 VmRSS/4
Shared(pages) 共享页数 0
Trs(pages) 程序所拥有的可执行虚拟内存的大小 VmExe/4
Lrs(pages) 被映像到任务的虚拟内存空间的库的大小 VmLib/4
Drs(pages) 程序数据段和用户态的栈的大小 (VmData+ VmStk )4

cat /proc/[pid]/status

本process當前資源使用狀態

Name: cat 
State: R (running) 
SleepAVG: 88% 
Tgid: 5783 
Pid: 5783 
PPid: 5742 
TracerPid: 0 
Uid: 0 0 0 0 
Gid: 0 0 0 0 
FDSize: 256 
Groups: 0 1 2 3 4 6 10 
VmSize: 6588 kB 
VmLck: 0 kB 
VmRSS: 400 kB 
VmData: 144 kB 
VmStk: 2040 kB 
VmExe: 14 kB 
VmLib: 1250 kB 
StaBrk: 0804e000 kB 
Brk: 088df000 kB 
StaStk: bfe03270 kB 
ExecLim: 0804c000 
Threads: 1 
SigPnd: 0000000000000000 
ShdPnd: 0000000000000000 
SigBlk: 0000000000000000 
SigIgn: 0000000000000000 
SigCgt: 0000000000000000 
CapInh: 0000000000000000 
CapPrm: 00000000fffffeff 
CapEff: 00000000fffffeff 

參數解釋

Name 应用程序或命令的名字 
State 任务的状态,运行/睡眠/僵死/ 
SleepAVG 任务的平均等待时间(以nanosecond为单位),交互式任务因为休眠次数多、时间长,它们的 sleep_avg 也会相应地更大一些,所以计算出来的优先级也会相应高一些。 
Tgid 线程组号 
Pid 任务ID 
Ppid 父进程ID 
TracerPid 接收跟踪该进程信息的进程的ID号 
Uid Uid euid suid fsuid 
Gid Gid egid sgid fsgid 
FDSize 當前文件描述符的分配個數,32位元系統將以32倍數遞增,
64位元系統以64倍數遞增。
此數字只會增加不會減少。

列出當前使用的文件
ls -l /proc/`pgrep rsyslogd|grep -v grep`/fd  


Groups 
VmSize(KB) 任务虚拟地址空间的大小 (total_vm-reserved_vm),其中total_vm为进程的地址空间的大小,reserved_vm:进程在预留或特殊的内存间的物理页 
VmLck(KB) 任务已经锁住的物理内存的大小。锁住的物理内存不能交换到硬盘 (locked_vm) 
VmRSS(KB) 应用程序正在使用的物理内存的大小,就是用ps命令的参数rss的值 (rss) 
VmData(KB) 程序数据段的大小(所占虚拟内存的大小),存放初始化了的数据; (total_vm-shared_vm-stack_vm) 
VmStk(KB) 任务在用户态的栈的大小 (stack_vm) 
VmExe(KB) 程序所拥有的可执行虚拟内存的大小,代码段,不包括任务使用的库 (end_code-start_code) 
VmLib(KB) 被映像到任务的虚拟内存空间的库的大小 (exec_lib) 
VmPTE 该进程的所有页表的大小,单位:kb 
Threads 共享使用该信号描述符的任务的个数,在POSIX多线程序应用程序中,线程组中的所有线程使用同一个信号描述符。 
SigQ 待处理信号的个数 
SigPnd 屏蔽位,存储了该线程的待处理信号 
ShdPnd 屏蔽位,存储了该线程组的待处理信号 
SigBlk 存放被阻塞的信号 
SigIgn 存放被忽略的信号 
SigCgt 存放被俘获到的信号 
CapInh Inheritable,能被当前进程执行的程序的继承的能力 
CapPrm Permitted,进程能够使用的能力,可以包含CapEff中没有的能力,这些能力是被进程自己临时放弃的,CapEff是CapPrm的一个子集,进程放弃没有必要的能力有利于提高安全性 

幾個 process 相關的

ls /proc/PID/cmdline : process arguments
ls /proc/PID/cwd : process current working directory (symlink)
ls /proc/PID/exe : path to actual process executable file (symlink)
ls /proc/PID/environ : environment used by process
ls /proc/PID/root : the root path as seen by the process. For most processes this will be a link to / 
        unless the process is running in a chroot jail.
cat /proc/PID/status : basic information about a process including its run state and memory usage.

ls /proc/PID/task : hard links to any tasks that have been started by this (the parent) process.

列出 process fd

//看當前配置的 fd size
cat /proc/pid/status

//列出詳細 fd 內容
sudo ls -la /proc/pid/fd
//計算總數
ls -l /proc/28290/fd | wc -l

sudo lsof -p 28290
sudo lsof -a -p 28290


顯示 socket fd 詳細內容

sudo lsof -i | grep 4654214  //socket fd 
sudo netstat -alep | erep -i 4654214  //socket fd

2019年1月21日 星期一

MySQL 重整及optimize

REPARE TABLE table_name;
OPTIMIZE TABLE table_name;

or

$mysqlcheck -u root -p --auto-repair --optimize --all-databases


INNODB table不直接支援optimize,
而是建立新table再把資料copy過去,然後分析,

所以會顯示:
Table does not support optimize, doing recreate + analyze instead

MySQL 字元集 character set

How to support full Unicode in MySQL databases
Mysql字元集詳解
Mysql utf8mb4說明

character set 字元集

utf8mb4=utf8 most byte 4 是比utf8更完整的字元集

collation 字元排序方式

utf8mb4_unicode_ci 是依據unicode排序
utf8mb4_general_ci 無依據unicode排序,所以排序可能某些字元會不如預期

實作上只要全部統一就好,table跟mysql 系統相同,
用utf8mb4_unicode_ci或utf8mb4_general_ci都可以

檢查字元集指令

mysql> SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' 
OR Variable_name LIKE 'collation%';

字元集變數

character_set_client | utf8mb4 |
character_set_connection | utf8mb4 |
character_set_database | utf8mb4 |
character_set_filesystem | binary |
character_set_results | utf8mb4 |
character_set_server | utf8mb4 |
character_set_system | utf8 |
character_sets_dir | /usr/share/mysql-8.0/charsets/

變數說明

character_set_client
客户端请求数据的字符集

character_set_connection
从客户端接收到数据,然后传输的字符集

character_set_database
默认数据库的字符集,无论默认数据库如何改变,都是这个字符集;如果没有默认数据库,那就使用 character_set_server指定的字符集,这个变量建议由系统自己管理,不要人为定义。

character_set_filesystem
把os上文件名转化成此字符集,即把 character_set_client转换character_set_filesystem, 默认binary是不做任何转换的

character_set_results
结果集的字符集

character_set_server
数据库服务器的默认字符集

character_set_system
这个值总是utf8,不需要设置,是为存储系统元数据的字符集


設定完整支援utf8mb4

分兩個部分 1 config中設定  2 建立table及建立column時設定

1.
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

2.
# For each database:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;

# For each table:
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

# For each column:
ALTER TABLE table_name CHANGE column_name column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

2018年9月27日 星期四

MySQL Datetime and Timestemp

Basic


StackOverflow

Datetime 基本上就是儲存某個時間,通常不會改變。
Timestamp 基本上用來當作戳記,也就是會改變。當你改資料,會一起改timestamp。

Datetime

存入死的日期,就算更改mysql timezone,資料也不會變。

Timestamp

Save:current time zone converted to UTC for storage.
Retrieval: converted from UTC to current time zone for retrieval.
Timestamp存入的是UTC時間,取出後,會根據mysql time zone轉成當地時間。

兩者比較

處理速度大部份時候比datetime快。
timestamp有cache,datetime沒有。
timestamp有max 2038年問題。


Defult Value


官方說明

CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);


CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  dt DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT 0,
  dt DATETIME DEFAULT 0
);

CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP,
  dt DATETIME DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP
);

CREATE TABLE t1 (
  ts1 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,     -- default 0
  ts2 TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP -- default NULL
);

Eg.

mysql> show variables like '%time_zone%';
+------------------+---------------------+
| Variable_name    | Value               |
+------------------+---------------------+
| system_time_zone | India Standard Time |
| time_zone        | Asia/Calcutta       |
+------------------+---------------------+

mysql> create table datedemo(
    -> mydatetime datetime,
    -> mytimestamp timestamp
    -> );

mysql> insert into datedemo values ((now()),(now()));

mysql> select * from datedemo;
+---------------------+---------------------+
| mydatetime          | mytimestamp         |
+---------------------+---------------------+
| 2011-08-21 14:11:09 | 2011-08-21 14:11:09 |
+---------------------+---------------------+

mysql> set time_zone="america/new_york";

mysql> select * from datedemo;
+---------------------+---------------------+
| mydatetime          | mytimestamp         |
+---------------------+---------------------+
| 2011-08-21 14:11:09 | 2011-08-21 04:41:09 |
+---------------------+---------------------+

2018年9月24日 星期一

MySQL JOIN

INNER JOIN / JOIN

選取兩個表的交集部分,產生新的結果表。

Eg.

select item.id, item.weapon from item INNER join user on user.id=item.user_id;


LEFT OUTER JOIN

以左表為主,查詢左表中有,但右表中沒有的資料。


MySQL KEY, INDEX

KEY

Key 都會自動建立index
Key可以說是index加上某種限制

PRIMARY KEY

Only one PRIMARY KEY in a table
Value must be unique
Value can not be null
Indexing auto
Primary key允許欄位有null

UNIQUE KEY

Value of column must be unique
Can be null
Indexing auto
Unique key允許欄位有null

CREATE TABLE table_name(
	//...
   UNIQUE KEY(index_column_,index_column_2,...) 
);

//set unique index
CREATE UNIQUE INDEX index_name ON table_name(index_column_1,index_column_2,...);

FOREIGN KEY


Indexing auto
Only references to PRIMARY KEY in another table (NO)

Parameter:
ON DELETE {CASCADE | SET NULL | NO ACTION}
ON UPDATE {CASCADE | SET NULL | NO ACTION | RESTRICT}

Eg.

CREATE TABLE item (
id INT AUTO_INCREMENT,
PRIMARY KEY(id),
user_id INT NOT NULL,
FOREIGN KEY(user_id) REFERENCES user(id) ON DELETE CASCADE ON UPDATE CASCADE);

條件

使用innodb

Eg.

CREATE TABLE product (
prod_id INT NOT NULL,
prod_name CHAR(20),
PRIMARY KEY (prod_id))
ENGINE = INNODB;

CREATE TABLE order (
order_id INT NOT NULL,
prod_id INT,
FOREIGN KEY(prod_id) REFERENCES product(prod_id)
ON DELETE CASCADE
ON UPDATE CASCADE,
PRIMARY KEY (order_id))
ENGINE = INNODB;


設定 foreign key
 order table 的 prod_id 為foreign key

設定參數
ON DELETE CASCADE
ON UPDATE CASCADE

效果
此時如果 delete product table的某筆資料,
也會 delete order 有foreign key參考到的資料。

此時如果update product table的某筆 prod_id,
也會 update order 有foreign key參考到的 prod_id。

此時drop product table 會出錯,因為 order table 參考到它。

FOREIGN KEY 參數說明

[ON DELETE {CASCADE | SET NULL | NO ACTION | RESTRICT}]
[ON UPDATE {CASCADE | SET NULL | NO ACTION | RESTRICT}]

當關聯父資料表的主鍵紀錄行被刪除或修改時,InnoDB 對子資料表中紀錄行的處理方式:

CASCADE - 會將有所關聯的紀錄行也會進行刪除或修改。
SET NULL - 會將有所關聯的紀錄行設定成 NULL。
NO ACTION - 有存在的關聯紀錄行時,會禁止父資料表的刪除或修改動作。
RESTRICT - 與 NO ACTION 相同。

FOREIGN KEY效用

  1. 利用 db schema 防止程式錯誤及阻擋不合法寫入。
  2. 加速 join 效率。

INDEX

參考
Create a indexing data in another table for searching faster.
Index 允許欄位有null
Index 不必要是唯一值

Eg.
CREATE TABLE index_sample(
id INT,
index id_idx(id));

Eg.1
CREATE INDEX index_name ON table_name(column_name(length));

If column is CHAR, VARCHAR type, lenght can less then real length.
If is BLOB or TEXT ,must have length assigned.

Eg.2
ALTER table_name ADD INDEX index_name ON column_name(length))

組合索引

把常用的幾個一起查詢的欄位,建立成一個組合索引,效率更好。

CREATE TABLE my_table(  
id INT NOT NULL,   
user_name VARCHAR(16) NOT NULL,  
city VARCHAR(50) NOT NULL,  
age INT NOT NULL 
);  

//三個欄位建立組合索引
ALTER TABLE my_table ADD INDEX name_city_age (uer_name(10),city,age); 


等於建立以下三個索引
user_name, city, age
user_name, city
user_name
因為索引組合是從最左邊開始的。

以下查詢會用到這個組合索引

SELECT * FROM my_table WHERE user_name="name" AND city="zz"
SELECT * FROM my_table WHERE user_name="abc"
以下查詢不會用到這個組合索引

SELECT * FROM my_table WHERE age=10 AND city="zz"
SELECT * FROM my_table WHERE city="qqq"

INDEX使用時機

Mysql 在以下時機使用

//在 WHERE 中使用
//在 JOIN 中使用
< 
<=
=
>
>=
BETWEEN
IN
及某些LIKE
LIKE "%qee",用%開頭的LIKE不會用索引
LIKE "qee%"這樣會用

以下要對city 及 age建立索引,
my_table的user_name也要。

SELECT t.Name 
FROM my_table t LEFT JOIN my_table m   
ON t.Name=m.user_name WHERE m.age=20 AND m.city="xxx" 




索引的缺點

  • 索引加快搜尋速度,降低更改速度。因為INSERT, UPDATE, DELETE也要更新索引。
  • 索引會佔用一點空間。

使用索引注意事項,以下不會使用索引

  • 當mysql優化器判斷全表掃描比索引快
  • 索引不會包含有NULL的欄位
  • 多使用短索引
  • 不鼓勵使用LIKE
  • 不要在SQL語句上計算
  • 不要在SQL語句上使用函數運算
//這樣有計算
select * from users where YEAR(adddate)

//改成這樣
select * from users where adddate<‘2007-01-01’
  • 不使用NOT IN 和 <>
  • 類型錯誤
  • //假設 X type 是 char
    select * from users where X =1
    
    //改成這樣
    select * from users where X ='1'
    

強制使用索引

force index 索引名

優化

my.cnf 中的 key_buffer 值能夠把所有索引容納進去最好
SQL 指令前加上 explain 來顯示該 SQL 是否用到索引

2018年9月18日 星期二

MySQL 8.0 更改為native password 及 忘記密碼重設



更改為native password

[mysqld]
default-authentication-plugin=mysql_native_password

新的
default-authentication-plugin=caching_sha2_password

這樣子沒用,會造成原本的root無法登入。
mysql> alter user 'root'@'localhost' identified with mysql_native_password by 'password';


移除password validate 


UNINSTALL COMPONENT 'file://component_validate_password';


重設密碼


Stop the MySQL server if necessary, then restart it with the --skip-grant-tables
shell> mysql
mysql> FLUSH PRIVILEGES;
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';