Mysql:大量kill process id

mysql 被搞爛的時候 ex: 下錯 index , alert 錯, 屬性 ...
大量的 process 堆積又不能 stop mysql,我們需要一個大量 kill 的 script
先了解資料該從哪裡來:

mysql> show create table information_schema.processlist \G;
*************************** 1. row ***************************
       Table: PROCESSLIST
Create Table: CREATE TEMPORARY TABLE `PROCESSLIST` (
  `ID` bigint(21) unsigned NOT NULL DEFAULT '0',
  `USER` varchar(32) NOT NULL DEFAULT '',
  `HOST` varchar(64) NOT NULL DEFAULT '',
  `DB` varchar(64) DEFAULT NULL,
  `COMMAND` varchar(16) NOT NULL DEFAULT '',
  `TIME` int(7) NOT NULL DEFAULT '0',
  `STATE` varchar(64) DEFAULT NULL,
  `INFO` longtext,
  `TIME_MS` bigint(21) NOT NULL DEFAULT '0',
  `ROWS_SENT` bigint(21) unsigned NOT NULL DEFAULT '0',
  `ROWS_EXAMINED` bigint(21) unsigned NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8

當然你也可直接用show processlist , 不過還要自己拆解欄位,selete table 篩選語法也很直觀
接著我們可以利用T-SQL 來組合出我們要的語法:

select concat('KILL ',id,';') from information_schema.processlist
where user='root' and time > 200 and info like 'select %' into outfile '/var/lib/mysql-files/kill.txt';
# user =  root
# time  >  200 sec
# info 是 selet 開頭
# 然後寫到 /var/lib/mysql-files/ , 確認無誤後再輸入
  
mysql> source /var/lib/mysql-files/kill.txt;

## 補充知識
/var/lib/mysql-files/ 這個目錄是預設位置,如果你想改,正常會得到以下錯誤

ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
執行以下語法查詢目前設定:

mysql> show global variables like '%secure_file_priv%';
# null 表示未設定

但這個值是維讀不能線上修改,必要的話要去改my.cnf ,然後重啟mysql
最無腦的就是設定,請留意安全性

secure_file_priv=''

其次是要寫入的目錄必需是mysql 的user 可寫,如我習慣用 mysql:mysql這個user:group 跑 mysql service ,
就必需 mysql 可以寫入,不然也是出錯

Mysql: ALL PRIVILEGES 帳號依然無開帳號 ( ERROR 1044)

一直以來用root@localhost 開帳號都沒什麼問題,開了一個[email protected] 給dev 用,就出問題了

檢查一下權限,發現也沒問題

再往下查

眼尖的你有發現嗎 ?
“Grant_priv: N”

查了一下google 大神,原來必需要有 Grant_priv 才能 Grant, 卻不包含在 ALL PRIVILEGES 裡

解法:

打完收工!

mysql 還原單一table

需求:在 mysqldump databases 的備份檔分割出單一 table dump file
mysqldump 時的環境參數至少需有
add-drop-table TRUE
lock-tables TRUE
使用sed 分表

線上環境範例
實測環境: centos6.9 , mysql5.5
分表:

還原:

一行:


2021-09-30
想開車不用自己造輪子-> github

mysql bin-log 操作

Mysql bin-log 操作

bin-log 檢視內容

一般 statement 格式,可能會狂噴,加個less

Row 格式

常用參數

其他參數請見 官方說明


bin-log 造成空間不足的處理方法

動作觸發 : 結束目前的binlog , 產生新的binlog , 檢查過期binlog並刪除

指定刪除某個時間以前的 binary log 檔案


指定刪除某個檔案流水號以前的 binary log 檔案


直接去刪binlog 檔,再把 binlog.index 裡面的記錄刪除,但是官方不建議這麼做

Mysql 日期和時間函數不求人

出處 : http://www.webasp.net/article/25/24538.htm
我的應用 : 查詢表格更新日期小於30天


這裡是一個使用日期函數的例子。下面的查詢選擇了所有記錄,其date_col的值是在最後30天以內:
mysql> SELECT something FROM table WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30;
DAYOFWEEK(date)
返回日期date的星期索引(1=星期天,2=星期一, ……7=星期六)。這些索引值對應於ODBC標準。
mysql> select DAYOFWEEK('1998-02-03');
-> 3
WEEKDAY(date)
返回date的星期索引(0=星期一,1=星期二, ……6= 星期天)。
mysql> select WEEKDAY('1997-10-04 22:23:00');
-> 5
mysql> select WEEKDAY('1997-11-05');
-> 2
DAYOFMONTH(date)
返回date的月份中日期,在1到31範圍內。
mysql> select DAYOFMONTH('1998-02-03'); Read More

mysql中ip排序的問題

當查詢以IP排序時
               select * from mypc order by ip
出現下面囧境:
192.168.1.1
192.168.1.11
192.168.1.111
192.168.1.2
192.168.1.22

在mysql中有兩個函數,一個INET_NTOA() 一個INET_ATON()
N就是數字(NUMBER) A就是位址(ADDRESS)
如果下指令   SELECT INET_ATON('127.0.0.1');
出現   2130706433
如果下指令   SELECT INET_NTOA(2130706433);
出現   '127.0.0.1'
所以我在查詢時排序使用INET_ATON()就可以把IP使用數字化排序。
指令:
          select * from ipmactable order by inet_aton(ip)
便可正常如下:
192.168.1.1
192.168.1.2
192.168.1.5
192.168.1.22
192.168.1.111

 

來源 : http://hd-inky.blogspot.tw/2010/05/mysqlip.html

mysql 查詢最後執行指令方法

MySQL 有幾種方法可以用, 將以挑喜歡的其中一種, 加入 /etc/mysql/my.cnf(debian), 再 restart mysql 即可:
第一種: 查 Slow query 的 SQL 語法:

  • log_slow_queries = /var/log/mysql/mysql-slow.log
  • long_query_time = 2 (超過 2秒的 SQL 語法記錄起來, 設短一點來記錄除錯也是一種方法 XD)

第二種: 設 MySQL Replication 用 binlog:

  • log_bin = /var/log/mysql/mysql-bin.log (此檔要用 mysqlbinlog 解來看)
  • mysql 會將所有 INSERT/UPDATE/DELETE 語法記於此(但是語法可能跟你想的不同), 這是要寫給 SLAVE 用的 log 檔

第三種: 推薦此方法, 將 MySQL 執行的每行指令全都記錄起來:

  • log = /tmp/mysql.log

restart mysql 後, tail -f /tmp/mysql.log

Oracle DB 建立 VIEW

以為在目前公司 ERP 不會用到VIEW , 沒想到居然遇到 SQL 指令超過2000字,就已逹程式上限的冏境 ...

所以還是來google 一下 oracle DB 怎麼建view

1.建立




 

2.修改


 

3.刪除


 

4.查詢


ORACLE:ORA-01940 無法刪除使用者解決方法

早上接到要重倒測試資料庫的任務

照往常進入ORACLE 要砍掉資料庫,但出現ORA-01940 錯誤訊息, 原因是有使用者連線卡在上面,上次碰到我的老闆教我的是重開主機 ,或 一陣子再做 .......  當時不好意思問他如果很急怎麼辦 !!

今天就來google 一下找方法 , 其實也不難 , 強制把 SESSION KILL 就可以了

1.找出卡在線上的 SESSION ,請用有管理權限之帳號(我是用SYSTEM 做的 , 對 ORACLE DB 有點小小不熟,對權限控管的定義還不是很清楚) ,在可操作 ORACLE 的工具上\執行以下t T-SQL

 

2.可查出如以下列表資料

USERNAME   

SID

SERIAL#

USER_NAME

37

41363

USER_NAME

47

25604

USER_NAME

158

14321

3.把 SESSION 踢掉 , 請用以下 T-SQL  (SID=37 ,SERIAL=41363), 全部 踢完就可以去刪資料庫了