本文目錄一覽:
- 1、我想修改mysql資料庫的名字,可以怎麼修改
- 2、如何使用命令修改MySQL資料庫名?
- 3、怎麼修改mysql資料庫表中內容
- 4、如何修改MySQL資料庫名稱
- 5、linux 怎麼更改mysql資料庫儲存
- 6、MySQL(DML數據操作語言,添加/刪除/修改資料庫數據)
我想修改mysql資料庫的名字,可以怎麼修改
被取消的命令MySQL 之前提供了一個 rename database db_old to db_new 的命令來直接對資料庫改名,可能由於實現的功能不完備(比如,這條命令可能是一個超大的事務,或者是由於之前的表很多還是 MyISAM 等),後來的版本直接取消了這條命令。更改資料庫名大致上有以下幾種方案:
一、mysqldump 導入導出要說最簡單的方法,就是直接用 mysqldump 工具,在舊庫導出再往新庫導入(最原始、最慢、最容易想到)的方法:舊庫 yttdb_old 導出(包含的對象:表、視圖、觸發器、事件、存儲過程、存儲函數)
二、改整庫的表名利用 MySQL 更改表名的方法來批量把舊庫的所有表依次遍歷,改名為新庫的表。這種方法比第一種要快很多倍,但是沒有第一步操作起來那麼順滑,不能一步到位。比如,要把資料庫 yttdb_old 改名為 yttdb_new,如果資料庫 yttdb_old 里只有磁碟表,那很簡單,直接改名即可。或者寫個腳本來批量改,非常簡單。但是一般舊庫里不只有磁碟表,還包含其他各種對象。這時候可以先考慮把舊庫的各種對象導出來,完了在逐一改完表名後導進去。
三、歷史方案其實在 MySQL 早期還有一種方法。假設 MySQL 部署好了後,所有的 binlog 都有備份,並且二進位日誌格式還是 statement 的話,那就可以簡單搭建一台從機,讓它慢慢追主機到新的庫名,等確切要更改舊庫的時候,再直接晉陞從機為主機即可。這裡只需要從機配置一個參數來把舊庫指向為新庫:replicate-rewrite-db=yttdb_old-yttdb_new不過這種局限性很大,不具備標準化,不推薦。
總結其實針對 MySQL 本身改庫名,大致就這麼幾種方法:
如果數據量小,推薦第一種;
數據量大,則推薦第二種;
數據量巨大,那就非 MySQL 本身能解決的了。
可通過部署第三方 ETL 工具,通過解析 MySQL 二進位日誌或其他的方式來把舊庫數據直接讀取到新庫達到改名的目的等等。
如何使用命令修改MySQL資料庫名?
MySQL 的 Binlog 記錄著 MySQL 資料庫的所有變更信息,了解 Binlog 的結構可以幫助我們解析Binlog,甚至對 Binlog 進行一些修改,或者說是「篡改」,例如實現類似於 Oracle 的 flashback 的功能,恢復誤刪除的記錄,把 update 的記錄再還原回去等。本文將帶您探討一下這些神奇功能的實現,您會發現比您想像地要簡單得多。本文指的 Binlog 是 ROW 模式的 Binlog,這也是 MySQL 8 里的默認模式,STATEMENT 模式因為使用中有很多限制,現在用得越來越少了。
Binlog 由事件(event)組成,請注意是事件(event)不是事務(transaction),一個事務可以包含多個事件。事件描述對資料庫的修改內容。
現在我們已經了解了 Binlog 的結構,我們可以試著修改 Binlog 里的數據。例如前面舉例的 Binlog 刪除了一條記錄,我們可以試著把這條記錄恢復,Binlog 裡面有個刪除行(DELETE_ROWS_EVENT)的事件,就是這個事件刪除了記錄,這個事件和寫行(WRITE_ROWS_EVENT)的事件的數據結構是完全一樣的,只是刪除行事件的類型是 32,寫行事件的類型是 30,我們把對應的 Binlog 位置的 32 改成 30 即可把已經刪除的記錄再插入回去。從前面的 「show binlog events」 裡面可看到這個 DELETE_ROWS_EVENT 是從位置 378 開始的,這裡的位置就是 Binlog 文件的實際位置(以位元組為單位)。從事件(event)的結構裡面可以看到 type_code 是在 event 的第 5 個位元組,我們寫個 Python 小程序把把第383(378+5=383)位元組改成 30 即可。當然您也可以用二進位編輯工具來改。
找出 Binlog 中的大事務
由於 ROW 模式的 Binlog 是每一個變更都記錄一條日誌,因此一個簡單的 SQL,在 Binlog 里可能會產生一個巨無霸的事務,例如一個不帶 where 的 update 或 delete 語句,修改了全表裡面的所有記錄,每條記錄都在 Binlog 裡面記錄一次,結果是一個巨大的事務記錄。這樣的大事務經常是產生麻煩的根源。我的一個客戶有一次向我抱怨,一個 Binlog 前滾,滾了兩天也沒有動靜,我把那個 Binlog 解析了一下,發現裡面有個事務產生了 1.4G 的記錄,修改了 66 萬條記錄!下面是一個簡單的找出 Binlog 中大事務的 Python 小程序,我們知道用 mysqlbinlog 解析的 Binlog,每個事務都是以 BEGIN 開頭,以 COMMIT 結束。我們找出 BENGIN 前面的 「# at」 的位置,檢查 COMMIT 後面的 「# at」 位置,這兩個位置相減即可計算出這個事務的大小,下面是這個 Python 程序的例子。
切割 Binlog 中的大事務
對於大的事務,MySQL 會把它分解成多個事件(注意一個是事務 TRANSACTION,另一個是事件 EVENT),事件的大小由參數 binlog-row-event-max-size 決定,這個參數默認是 8K。因此我們可以把若干個事件切割成一個單獨的略小的事務
ROW 模式下,即使我們只更新了一條記錄的其中某個欄位,也會記錄每個欄位變更前後的值,這個行為是 binlog_row_image 參數控制的,這個參數有 3 個值,默認為 FULL,也就是記錄列的所有修改,即使欄位沒有發生變更也會記錄。這樣我們就可以實現類似 Oracle 的 flashback 的功能,我個人估計 MySQL 未來的版本從可能會基於 Binlog 推出這樣的功能。
了解了 Binlog 的結構,再加上 Python 這把瑞士軍刀,我們還可以實現很多功能,例如我們可以統計哪個表被修改地最多?我們還可以把 Binlog 切割成一段一段的,然後再重組,可以靈活地進行 MySQL 資料庫的修改和遷移等工作。
怎麼修改mysql資料庫表中內容
以windows為例
方法一(假設mysql在d:\mysql目錄下)
1、用系統管理員登陸windows系統。
2、停止MySQL的服務。
3、運行cmd進入dos命令窗口,然後進入MySQL的安裝目錄,比如安裝目錄是d:\mysql,進入d:\mysql\bin (如果是c:\Program Files\mysql目錄,目錄包含空格,使用cd “c:\Program Files\mysql”進入mysql目錄)
4、跳過許可權檢查啟動MySQL(關鍵的一步)
d:\mysql\binmysqld-nt –skip-grant-tables(會佔用一個dos控制台窗口,不能關閉)
5、重新打開一個dos控制台窗口,進入d:\mysql\bin目錄,設置root的新密碼
d:\mysql\binmysqladmin -u root flush-privileges password 【新密碼】
(注意:這條命令如果重複執行,可能需要關閉4的窗口並重新運行)
d:\mysql\binmysqladmin -u root -p shutdown(或直接關閉第一個dos控制台窗口)
將【新密碼】替換為你要用的root的密碼,第二個命令可能會提示你輸入新密碼,重複第一個命令輸入的密碼。
6、關閉MySQL的控制台窗口,用正常模式啟動Mysql
7、你可以用新的密碼鏈接到Mysql了。
方法二
1、停止mysql服務
2、找到mysql數據的data目錄,將另外一個mysql的data目錄下的mysql目錄覆蓋過來(如果知道root密碼)
(操作之前先備份mysql\data\mysql目錄的所有文件)
這種方法缺點:覆蓋掉其他的用戶,mysql的版本需相同
3、重新啟動mysql服務
如何修改MySQL資料庫名稱
修改MySQL資料庫名稱的方法如下:
1.語句修改法:
RENAME DATABASE db_name TO new_db_name
這個語法在mysql 5.1.7中被添加進來,到了5.1.23又去掉了。
2.如果所有表都是MyISAM類型的話,可以改文件夾的名字
把data目錄中的db_name目錄重命名為new_db_name
3.重命名所有的表
代碼如下:
4. mysqldump導出數據再導入
代碼如下:
5.使用shell腳本重命名所有的表
代碼如下:
linux 怎麼更改mysql資料庫儲存
mnt目錄下建立mysql_data目錄
#cd /mnt
#mkdir mysql_data
把MySQL服務服務停掉。
#service mysql stop
把/var/lib/mysql整個目錄移到/mnt/mysql_data。
#mv /usr/local/mysql/data /mnt/mysql_data
重新設置數據許可權。
#cd /mnt/mysql_data
修改my.cnf配置文件
#vi /etc/my.cnf
指明mysql.sock文件的產生位置。用符號#注釋掉原來socket,
修改MySQL啟動腳本。
#vi /etc/init.d/mysql
找到datadir。
datadir = /mnt/mysql_data
7
重啟mysql服務
#service mysql start
好了,至此資料庫目錄位置已遷移完畢。
MySQL(DML數據操作語言,添加/刪除/修改資料庫數據)
插入數據
insert into 表名(欄位) values(『數據』);
insert into 表名1(name,age) select name,age from 表2; #表2 數據信息複製到表1
修改數據
update 表名 set ‘欄位’=’數據’; #修改數據
delect from 表名 where 欄位=值; #刪除數據
truncate table 表名; #清空所有數據 且無法恢復
DQL (數據查詢語言,用來查詢數據)
select 要查詢欄位 from 表名 [where 滿足條件];
[group by 分組依據]
[order by 排序依據]
[limit 限定輸出結果]
select * from 表名; #查詢 表 所有數據
select 欄位 欄位 from 表名; #查詢指定欄位數據
select st.name,st.age,th.name,th.age from st,th; #查詢一個或多個 表中的數據
SELECT 欄位名 FROM 表名 WHERE 條件1 OR 條件2 […OR 條件n];
例:SELECT * FROM students WHERE age20 OR education!=’大專’; #查詢年齡小於20或 者學歷不等於大專的學生信息
SELECT 欄位名 FROM 表名 WHERE 條件1 AND 條件2 […AND 條件n];
例:SELECT * FROM students WHERE age22 AND education=’大專’; # 查詢年齡大於22 且學歷為大專的學生信息
select 欄位 from 表名 where age in (12,17,23); #數據在指定 數據 裡面
select 欄位 from 表名 where age between 23 and 28; #數據在23-28 之間
select * from 表名 order by 欄位名; #排序,升序
select 欄位 from 表名 order by desc; # 欄位降序
select 欄位1,欄位2…… from 表名 group by 分組依據欄位; #每個欄位只顯示一條
例:SELECT id,sname,age,phone,place,GROUP_CONCAT(age,place) FROM students GROUP BY age,place; #查詢學生信息,根據age,place分組並顯示每一組的記 錄
select distinct 欄位 from 表名; #去除結果重複行
例:SELECT DISTINCT age FROM students; # 查詢學生的年齡段情況
selcet 欄位1,欄位2,group_concat(分組依賴欄位名) from 表名 group by 分組依賴欄位名; #查詢每個組中記錄數量,顯示出來(使用關鍵字GROUP BY與GROUP_CONCAT()函數一起使用,可以將每個組中的記錄數量都顯 示出來)
例:selcet id,sname,age,phone,GROUP_CONCAT(age) FROM students GROUP BY age; # 查詢學生id,姓名,年齡,電話,根據age分組並顯示每一組的記錄
SELECT 欄位名 FROM 表名 [其他條件] LIMIT int,int; 參數1是開始讀取的第一條記錄的 編號,參數2是要查詢記錄的個數
例:SELECT * FROM students ORDER BY age LIMIT 0,5; # 查詢學生信息,根據age 排序從第0位開始顯示,只顯示5條
select 欄位名 from 表名where欄位名 regexp ‘匹配方式’;
(^匹配以特定字元或 字元串開頭的記錄,
$匹配以特定字元或 字元串結尾的記錄
[^字符集 合]匹配除「字符集合」以 外的任意一個字元
S1|S2|S3匹配S1 S2 S3中 的任意一個字元串
字元串{N }匹配字元串出現N次
字元串 {M,N}匹配字元串出現至 少M次,最多N次)
聚合函數查詢
select count(欄位名) from 表名; #對於除”*”以外的任何參數,返回所選擇集合中非NULL值的行的數目;對於參數「*」,返回選擇集 合中所有行的數據,包含NULL值的行
例:SELECT COUNT(*) FROM students;
select sum(欄位名) from 表名; #表中某個欄位取值的總和
select avg(欄位名) from 表名; #表中某個欄位取值的平均值
select max(欄位名) from 表名; #表中某個欄位取值的最大值
select min(欄位名) from 表名; #表中某個欄位取值的最小值
連接查詢
a.內連接:列出數據表中與連接條件相匹配的數據行,組合成新記錄【只有滿足條件的記錄才出現在查詢結 果】 內連接的最常見的例子是相等連接,也就是連接後的表中的某個欄位與每個表中的都相同
select 欄位名1,欄位名2 from 表名1 inner join 表名2 where 連接條件;
例:select s.name,d.dname from staff s inner join department d WHERE s.dpid = d.id; # 連接員工表的dpid欄位和部門表的id欄位,並查詢員工姓名和部門名稱
b.外連接:與內連接不同,外連接是指使用OUTER JOIN關鍵字將兩個表連接起來。外連接生成的結果集不僅 包含符合連接條件的行數據 ,而且還包含左表(左外連接時的表) 右表(右外連接時的表)或 兩邊連接表(全外連接時的表)中所有的數據行。
select 欄位名稱 from 表名1 LEFT|RIGHT join 表名2 on 表名1.欄位名1 = 表名2.欄位名2;
例:select s.name,d.dname FROM staff s LEFT JOIN department d ON s.dpid = d.id; #連接員工表的dpid欄位和部門表的id欄位,並查詢員工姓名和部門名稱,如果右表中沒有對應的 連接數據,會自動添加NULL值
例:SELECT s.name,d.dname FROM staff s RIGHT JOIN department d ON s.dpid = d.id; # 連接員工表的dpid欄位和部門表的id欄位,並查詢員工姓名和部門名稱,如果左表中沒有對應 的連接數據,會自動添加NULL值
例:SELECT 欄位名1,欄位名2 FROM 表名1,表名2 WHERE 連接條件 AND 限制條件; 例:SELECT s.name,d.dname FROM staff s,department d WHERE s.dpid = d.id AND s.dpid1; # 查詢員工姓名和部門名稱,條件是員工表的dpid欄位與部門表中的id欄位相等,並且dpid大於1
合併查詢結果
select 欄位名 from 表名 UNION select 欄位名 from 表名; #關鍵字UNION是將所 有的查詢結果合併到一起,並且去除相同記錄
例:SELECT dpid FROM staff UNION SELECT id FROM department; # 查詢員工表dpid與部門表id,如果有重複數據,只顯示一次
select 欄位名 drom 表名 UNION ALL select 欄位名from表名; #關鍵字UNION ALL 則只是簡單地將結果合併到一 起
例:SELECT dpid FROM staff UNION ALL SELECT id FROM department; # 查詢員工表dpid與部門表id,全部顯示
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/310065.html