MySQL and MariaDB memo
第一次安裝完成,設定root的密碼
mysqladmin -u root -p ‘密碼’ or mysql_secure_installation
重設root密碼
/etc/init.d/mysql stop
mysqld_safe --skip-grant-tables &
mysql -u root
mysql> use mysql;
mysql> UPDATE user SET Password=PASSWORD("密碼") WHERE User='root';
mysql> flush privileges;
mysql> quit
/etc/init.d/mysql stop
/etc/init.d/mysql start
連線管理資料庫
mysqladmin -u root -p
Enter password: 此時再輸入密碼(建議採用)
修改使用者密碼
方法一
使用有權限或要修改的使用者本身登入mysql
mysql> SET PASSWORD FOR '目標使用者'@'主機' = PASSWORD('密碼');
mysql> flush privileges
方法二
使用有權限的使用者登入mysql
修改使用者密碼,只改 root 的密碼,如果沒有用 where ,則表示改全部 user 的密碼
mysql> use mysql;
mysql> UPDATE user SET password=password('密碼') where user='root';
mysql> FLUSH PRIVILEGES;
上面是不分主機位址的修改,若要像方法一區分主機的話再加上Host條件,例如
mysql> UPDATE user SET Password=PASSWORD("密碼") WHERE User='root' AND Host = 'localhost';
mysql> FLUSH PRIVILEGES;
方法三
同樣利用mysqladmin指令可以修改root或其他使用者密碼,但該使用者必須有SUPER權限
mysqladmin -u 使用者 -p'舊密碼' password '新密碼'
忘記密碼重設
/etc/init.d/mysql stop
mysqld_safe --skip-grant-tables &
用上面方式啟動mysql後可以不用輸入密碼直接連入
mysql -u root
接者使用修改使用者密碼的方法二修改root密碼,最後重新啟動mysql
新增root可遠端存取 %表示任何IP或只接輸入IP
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '密碼' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;
資料庫(DateBase)十五種權限
ALL PRIVILEGES、ALTER、CREATE、DELETE、DROP、FILE、INDEX、INSERT、PROCESS、REFERENCES、RELOAD、SELECT、SHUTDOWN、UPDATE、USAGE
資料表(Table)八種權限
SELECT、INSERT、UPDATE、DELETE、CREATE、DROP、INDEX、ALTER
資料欄(column)三種權限
SELECT INSERT UPDATE
查詢現有User
select user from mysql.user;
查詢MySQL 對 此帳號 開放(GRANT)哪些權限
查詢 某 User 的權限
SELECT User,Host FROM mysql.user; # 秀出系統現在有哪些 user
SHOW GRANTS FOR username@localhost; # 會秀出開此 username 時下的 Grant 語法, 也可用此來做帳號備份.
結果: GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'username'@'localhost' IDENTIFIED BY PASSWORD
結果: GRANT USAGE ON *.* TO '帳號'@'192.168.88.%' IDENTIFIED BY PASSWORD
' GRANT SELECT, EXECUTE ON '資料庫'.* TO '帳號'@'192.168.88.%'
下述這些結果都一樣, 都是列出 目前此User 的權限.
SHOW GRANTS;
SHOW GRANTS FOR CURRENT_USER;
SHOW GRANTS FOR CURRENT_USER();
修改
mysql> update db set Host='202.54.10.20' where Db='webdb';
mysql> update user set Host='202.54.10.20' where user='webadmin';
刪除
mysql> DELETE FROM mysql.user WHERE User = 'root' AND Host = '%';
mysql> FLUSH PRIVILEGES;
刪除空帳號
mysql> DELETE FROM user WHERE User = '';
mysql> FLUSH PRIVILEGES;
建立新帳號
GRANT SELECT,INSERT,UPDATE ON datab_name.* TO user@host IDENTIFIED BY 'passwd';
GRANT ALL ON *.* TO root@'10.99.1.%' IDENTIFIED BY '密碼';
mysql> GRANT 權限 ON 資料庫或資料表 TO 使用者 IDENTIFIED BY '密碼';
資料庫或資料表
*.*所有資料庫裡的所有資料表
*預設資料庫裡的所有資料表
資料庫.*某一資料庫裡的所有資料表
資料庫.資料表某一資料庫裡的特定資料表
資料表預設資料庫裡的某一資料表
範例 把 db35 這個資料庫(含其下的所有資料表),授權給 s35,從 localhost 上來
mysql> GRANT all ON bugdb.* TO bug@'localhost' IDENTIFIED BY '密碼';
mysql -h host -u user -p
安全性設定(*.*為資料庫.資料表, @前面的*表示帳號, %可改成IP比如140.92.25.1)
GRANT ALL PRIVILEGES ON *.* TO '*'@'%' IDENTIFIED BY '密碼' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES; (最後一定要強迫更新權限)
Permissible Privileges for GRANT and REVOKE
Privilege Meaning
ALL [PRIVILEGES] Grant all privileges at specified access level except GRANT OPTION
ALTER Enable use of ALTER TABLE
ALTER ROUTINE Enable stored routines to be altered or dropped
CREATE Enable database and table creation
CREATE ROUTINE Enable stored routine creation
CREATE TEMPORARY TABLES Enable use of CREATE TEMPORARY TABLE
CREATE USER Enable use of CREATE USER, DROP USER, RENAME USER, and REVOKE ALL PRIVILEGES
CREATE VIEW Enable views to be created or altered
DELETE Enable use of DELETE
DROP Enable databases, tables, and views to be dropped
EVENT Enable use of events for the Event Scheduler
EXECUTE Enable the user to execute stored routines
FILE Enable the user to cause the server to read or write files
GRANT OPTION Enable privileges to be granted to or removed from other accounts
INDEX Enable indexes to be created or dropped
INSERT Enable use of INSERT
LOCK TABLES Enable use of LOCK TABLES on tables for which you have the SELECT privilege
PROCESS Enable the user to see all processes with SHOW PROCESSLIST
REFERENCES Not implemented
RELOAD Enable use of FLUSH operations
REPLICATION CLIENT Enable the user to ask where master or slave servers are
REPLICATION SLAVE Enable replication slaves to read binary log events from the master
SELECT Enable use of SELECT
SHOW DATABASES Enable SHOW DATABASES to show all databases
SHOW VIEW Enable use of SHOW CREATE VIEW
SHUTDOWN Enable use of mysqladmin shutdown
SUPER Enable use of other administrative operations such as CHANGE MASTER TO, KILL, PURGE BINARY LOGS, SET GLOBAL, and mysqladmin debug command
TRIGGER Enable trigger operations
UPDATE Enable use of UPDATE
USAGE Synonym for “no privileges”
顯示目前有幾個資料庫
mysql> SHOW DATABASES;
+--------------------+
| Database |
+--------------------+
| information_schema |
| bugdb |
| mysql |
| test |
+--------------------+
3 rows in set (0.00 sec)
列出該資料庫所有資料表名稱
mysql> SHOW TABLES FROM 資料庫名 [LIKE ...];
列出該資料表所有欄位名稱
mysql> SHOW COLUMNS FROM table_name [LIKE ...];
mysql> SHOW COLUMNS FROM table_name FROM db_name [LIKE ...];
mysql> SHOW FIELDS FROM table_name [LIKE ...];
mysql> DESCRIBE table_name ;
mysql> EXPLAIN table_name ;
查詢資料庫大小
SELECT table_schema "DB Name", Round(Sum(data_length + index_length) / 1024 / 1024, 1) "DB Size in MB" FROM information_schema.tables GROUP BY table_schema;
+--------------------+---------------+
| DB Name | DB Size in MB |
+--------------------+---------------+
| bugdb | 2.5 |
| information_schema | 0.0 |
| mysql | 0.6 |
+--------------------+---------------+
查詢MySQL VARIABLES
mysql> SHOW VARIABLES LIKE '%log_bin%';
+---------------------------------+-------------------------------------------------+
| Variable_name | Value |
+---------------------------------+-------------------------------------------------+
| log_bin | ON |
| log_bin_basename | /rdsdbdata/log/binlog/mysql-bin-changelog |
| log_bin_index | /rdsdbdata/log/binlog/mysql-bin-changelog.index |
| log_bin_trust_function_creators | ON |
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |
+---------------------------------+-------------------------------------------------+
建立資料庫;
CREATE DATABASE 資料庫名;
使用資料庫
USE 資料庫名;
刪除資料庫 DROP DATABASE 資料庫名;
DROP DATABASE [IF EXISTS] 資料庫名;
建立資料表 CREATE TABLE 資料表名 (欄位1 資料型態, 欄位2 資料型態, ……);
CREATE TABLE 資料表名 (autono INT NOT NULL AUTO_INCREMENT PRIMARY KEY, RACKID varchar(10), RACKLEVEL varchar(10), KVMID varchar(10), CUSERY varchar(20), SERVERENAME varchar(50), SERVERCNAME varchar(50), SERVERTYPE varchar(50), OSTYPE varchar(50), IPADDRESS varchar(20), SERVICEINFO varchar(50), CPUTYPE varchar(50), RAM varchar(20), STORAGE varchar(20), CRID varchar(50), FNTYPE varchar(20));
資料結構(type):
資料型態 說明
TINYINT 有符號的範圍是-128到127, 無符號的範圍是0到255。
SMALLINT 有符號的範圍是-32768到32767, 無符號的範圍是0到65535。
MEDIUMINT 有符號的範圍是-8388608到8388607, 無符號的範圍是0到16777215。
INT 有符號的範圍是-2147483648到2147483647, 無符號的範圍是0到4294967295。
INTEGER INT的同義詞。
BIGINT 有符號的範圍是-9223372036854775808到 9223372036854775807,無符號的範圍是0到18446744073709551615。
FLOAT 單精密浮點數字。不能無符號。允許的值是-3.402823466E+38到- 1.175494351E-38,0 和1.175494351E-38到3.402823466E+38。
DOUBLE 雙精密)浮點數字。不能無符號。允許的值是- 1.7976931348623157E+308到-2.2250738585072014E-308、 0和2.2250738585072014E-308到1.7976931348623157E+308。
DOUBLE PRECISION DOUBLE的同義詞。
REAL DOUBLE的同義詞。
DECIMAL DECIMAL值的最大範圍與DOUBLE相 同。
NUMERIC DECIMAL的同義詞。
DATE 日期。支援的範圍是'1000-01-01'到'9999-12-31'。
DATETIME 日期和時間組合。支援的範圍是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'
TIMESTAMP 時間戳記。範圍是'1970-01-01 00:00:00'到2037年的某時。
TIME 一個時間。範圍是'-838:59:59'到'838:59:59'。
YEAR 2或4位數字格式的年(內定是4位)。允許的值是1901到2155。
CHAR 固定長度,1 ~ 255個字元。
VARCHAR 可變長度,1 ~ 255個字元。
TINYBLOB
TINYTEXT 最大長度為255(2^8-1)個字符。
MEDIUMBLOB
MEDIUMTEXT 最大長度為16777215(2^24-1)個字符。
LONGBLOB
LONGTEXT 最大長度為4294967295(2^32-1)個字符。
ENUM 一個ENUM最多能有65535不同的值。
SET 一個SET最多能有64個成員。
顯示表格
SHOW TABLES;
刪除資料表 DROP TABLE 資料表名;
DROP TABLE [IF EXISTS] tbl_name [, tbl_name,...]
顯示表格結構
DESCRIBE infolist;
新增資料
INSERT INTO infolist (RACKID,RACKLEVEL,KVMID,CUSERY,SERVERENAME,SERVERCNAME,SERVERTYPE,OSTYPE,IPADDRESS,SERVICEINFO,CPUTYPE,RAM,STORAGE,CRID,FNTYPE) VALUES ('1','1','1','test','demo center','DynaManager-90','ASUS RS500-E6','CAKE v3.0.16 Alpha Final','140.92.25.6','Virtualization(DAS)','Intel(R) Xeon(R) CPU E5620 @ 2.40GH *2','24G','DAS 1TB','S/N:134IH11','DeSSerT');
Using System Variables
SHOW VARIABLES;
SHOW VARIABLES LIKE 'wait_timeout';
SHOW VARIABLES LIKE 'interactive_timeout';
SHOW VARIABLES LIKE 'connect_timeout';
備份某個資料庫
mysqldump -u root -p -h 主機 資料庫名 > 資料庫備份檔名
備份all資料庫
mysqldump -u root -p -h 主機 --all-databases
同時備份多個MySQL資料庫
mysqldump -u root -p -h 主機 –databases 資料庫名1 資料庫名2 資料庫名3 > 資料庫備份檔名
備份MySQL資料庫為帶刪除表的格式,能夠讓該備份覆蓋已有資料庫而不需要手動刪除原有資料庫.
mysqldump -h 主機 -u root -p -–add-drop-table 資料庫名 > 資料庫備份檔名
僅備份資料庫結構
mysqldump -h 主機 -u root -p --no-data -–databases databasename1 databasename2 databasename3 > structurebackupfile.sql
備份MySQL資料庫某個(些)表
mysqldump -h 主機 -u root -p 資料庫名 specific_table1 specific_table2 > backupfile.sql
刪除資料庫的所有TABLES(DROP remove tables)
mysql -h 主機 -u root -p -Nse 'show tables' 資料庫名 | while read table; do mysql -u root -p -e "drop table $table" 資料庫名; done
清空資料庫的所有TABLES(Truncate empty tables)
mysql -h 主機 -u root -p -Nse 'SHOW TABLES' 資料庫名 | while read table; do mysql -u root -p -e "truncate table $table" 資料庫名; done
復原一個資料庫 (需先建好資料庫)
mysql -u root -p -h 主機 資料庫名 < 資料庫備份檔
還原壓縮的MySQL資料庫
gunzip < 資料庫備份檔名.sql.gz | mysql -h 主機 -u root -p 資料庫名
將資料庫轉移到新伺服器
mysqldump -u -p databasename | mysql –host=*.*.*.* -C databasename
If you want to see only a specific variable, you can use this command. Obviously you’d want to replace the max_connect_errors in that command with the variable that you’re looking for.
SHOW VARIABLES LIKE '%max_connect_errors%';
If you want to change the current state of a variable, you can do so easily with a command similar to this one:
SET GLOBAL max_connect_errors=10000;
Mysql> FLUSH HOSTS;
mysqlbinlog –start-datetime="2016-03-01 00:00:00" –stop-datetime="2016-03-16 00:00:00" -d bid mysql-bin.0001* > /root/replay.sql
tips
You need to use the -p flag to send a password. And it's tricky because you must have no space between -p and the password.
$ mysql -h "server-name" -u "root" "-pXXXXXXXX" "database-name" < "filename.sql"
If you use a space after -p it makes the mysql client prompt you interactively for the password, and then it interprets the next command argument as a database-name:
$ mysql -h "server-name" -u "root" -p "XXXXXXXX" "database-name" < "filename.sql"
Enter password:
ERROR 1049 (42000): Unknown database 'XXXXXXXX'
To avoid password prompt just create ~/.my.cnf file as follows:
[client]
#for local server use localhost
#host=localhost
host=10.0.1.100
user=vivek
password=myPassword
[mysql]
pager=/usr/bin/less
Then:
$ mysql -h "server-name" "database-name" < "filename.sql"
slow query
查看Server設定 :show variables ;
其中兩個參數,一個是slow_launch_time,一個是long_query_time。
slow_launch_time跟slow query log沒有任何關係, 它代表的是thread create的一個門檻值,long_query_time才是正確的。
查看Server運作的各種設定 : show global status;
可以用 show variables like '%slow%';過濾要找的值。
測試slow query,可以在用select搭sleep指令:
select sleep(2);
然後再去看slow query log