MySQL 使用

Undefined443發表於2024-06-06

忘記密碼

sudo vim /etc/mysql/debian.cnf

記住裡面的 password 值,然後用它來登入:

mysql -u debian-sys-maint -p
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';  -- 修改密碼為 password

ubuntu 系統下 mysql 重置密碼和修改密碼操作 | 部落格園

java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES) | Stack Overflow

執行 .sql 檔案

方法一

登入 MySQL 後,執行 source 命令:

mysql -u root -p
mysql> use database_name;
mysql> source /path/to/file.sql;

檔名不要加引號

PowerShell

Get-Content .\file.sql | mysql -u root -p

方法二

在終端中直接執行 .sql 檔案:

mysql -u root -p database_name < /path/to/file.sql

Q&A

Q: 在命令 mysql -uroot -proot_password 中,為什麼密碼和 -p 選項之間沒有空格?

A: 在 MySQL 命令列工具中,當您使用 -p 選項時,密碼和 -p 之間沒有空格是因為這種設計可以防止密碼洩漏。

當您在命令列中輸入命令時,其他使用者可能會透過 ps 命令(Linux/macOS)或 tasklist 命令(Windows)檢視正在執行的程序。如果密碼和-p選項之間有空格,那麼密碼可能會出現在這些命令的輸出中,從而洩露給其他使用者。

將密碼緊挨著 -p 選項輸入(即不使用空格),可以將密碼作為命令選項的一部分,這樣在程序列表中就不會顯示密碼。這提高了密碼在命令列中使用的安全性。

然而,將密碼直接寫在命令列中仍然存在一定的安全風險。為了更安全地使用 MySQL 命令列工具,建議只使用 -p 選項,而不輸入密碼。這樣,系統會提示您輸入密碼,而不是將密碼直接暴露在命令列中。例如:

mysql -u root -p

在這種情況下,MySQL 命令列工具會提示您輸入密碼,而不會將密碼顯示在螢幕上或程序列表中。這樣可以降低密碼洩露的風險。

DDL

SHOW DATABASES;  -- 顯示所有資料庫

CREATE DATABASE database;  -- 新建資料庫
CREATE DATABASE IF NOT EXISTS database;

DROP DATABASE database;  -- 刪除資料庫
DROP DATABASE IF NOT EXISTS database;

USE database;  -- 使用資料庫
SELECT DATABASE();  -- 顯示當前使用的資料庫

SHOW TABLES;  -- 顯示資料庫中的所有表

DESCRIBE table;  -- 查詢表結構

CREATE TABLE table (  -- 建立表
  -- ...
);

DROP TABLE table;  -- 刪除表
DROP TABLE IF EXISTS table;

/* 修改表 */
ALTER TABLE table1
RENAME TO table2;  -- 重新命名錶

ALTER TABLE table
ADD attribute type;  -- 增加屬性

ALTER TABLE table
MODIFY attribute new_type;  -- 修改屬性型別

ALTER TABLE table
CHANGE old_attribute new_attribute new_type;  -- 更改屬性

ALTER TABLE table
DROP attribute;  -- 刪除屬性

CREATE VIEW view AS (SELECT ... FROM ...);

CREATE TABLE table AS (SELECT ... FROM ...);

CREATE TABLE table1 LIKE table2;

DML

-- 增加資料
INSERT INTO table (attr1, attr2, ...)  -- (attr1, attr2, ...) 可省略
VALUES (val1, val2, ...), ...;

-- 更新資料
UPDATE table
SET attr1 = val1, attr2 = val2, ...
WHERE p;

-- 刪除資料
DELETE FROM table
WHERE p;

DQL

SELECT ...  -- 欄位
FROM ...  -- 表
WHERE ...  -- 條件
GROUP BY ...  -- 分組
HAVING ...  -- 分組後條件
ORDER BY ...  -- 排序
LIMIT ...  -- 分頁

實際開發

外來鍵約束一定要單獨寫:FOREIGN KEY (attr) REFERENCES table(attr);
不要這樣寫:attr INT REFERENCES table(attr),這樣加不上外來鍵約束的。

遠端連線

Server:

CREATE USER 'xiao'@'%' IDENTIFIED BY '1296954';  -- 建立使用者,% 表示允許任意主機連線

GRANT ALL PRIVILEGES ON *.* TO 'xiao'@'%'
WITH GRANT OPTION;  -- 授權,允許使用者對所有資料庫進行任意操作

Client:

mysql -u xiao -p -h 192.168.1.109  # -h 引數指定資料庫所在的主機

Host 'xxx.xx.xxx.xxx' is not allowed to connect to this MySQL server

修改密碼

set global validate_password_policy=0;  -- 修改密碼安全策略為低(只校驗密碼長度,至少 8 位)。
ALTER USER 'root'@'localhost' IDENTIFIED BY '12345678';

-- 授予 root 使用者遠端管理許可權
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '12345678';

MySQL 變數

-- 使用者變數,字首為 @,可以不宣告就使用(初始值為 NULL)
SET @var1 = 1, @var2 = 2;
SELECT @var1 := 1, @var2 := 2;  -- SELECT 必須用 := 賦值

-- 區域性變數,必須在 BEGIN ... END 中宣告後再使用
BEGIN
  DECLARE var INT DEFAULT 1;
END;

-- 系統變數,字首為 @@
SHOW VARIABLES LIKE 'sort_buffer_size';  -- 檢視變數值
SELECT @@sort_buffer_size;

SET GLOBAL sort_buffer_size=1000000;  -- 修改變數值
SET SESSION sort_buffer_size=1000000;

相關文章