原mysql數據庫,mysql數據庫百度百科

本文目錄一覽:

mysql卸載後怎麼找回原來建的數據庫?

每個 DBA 是不是都有過刪庫的經歷?刪庫了沒有備份怎麼辦?備份恢復後無法啟動服務什麼情況?表定義損壞數據無法讀取怎麼辦?

我曾遇到某初創互聯網企業,因維護人員不規範的備份恢復操作,導致系統表空間文件被初始化,上萬張表無法讀取,花了數小時才搶救回來。

當你發現數據無法讀取時,也許並非數據丟失了,可能是 DBMS 找不到描述數據的信息。

背景

先來了解下幾張關鍵的 InnoDB 數據字典表,它們保存了部分表定義信息,在我們恢復表結構時需要用到。

SYS_TABLES 描述 InnoDB 表信息CREATE TABLE `SYS_TABLES` (`NAME` varchar(255) NOT NULL DEFAULT ”,  表名`ID` bigint(20) unsigned NOT NULL DEFAULT ‘0’,  表id`N_COLS` int(10) DEFAULT NULL,`TYPE` int(10) unsigned DEFAULT NULL,`MIX_ID` bigint(20) unsigned DEFAULT NULL,`MIX_LEN` int(10) unsigned DEFAULT NULL,`CLUSTER_NAME` varchar(255) DEFAULT NULL,`SPACE` int(10) unsigned DEFAULT NULL,   表空間idPRIMARY KEY (`NAME`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;SYS_INDEXES 描述 InnoDB 索引信息CREATE TABLE `SYS_INDEXES` (  `TABLE_ID` bigint(20) unsigned NOT NULL DEFAULT ‘0’, 與sys_tables的id對應  `ID` bigint(20) unsigned NOT NULL DEFAULT ‘0’,  索引id  `NAME` varchar(120) DEFAULT NULL,         索引名稱  `N_FIELDS` int(10) unsigned DEFAULT NULL, 索引包含字段的個數  `TYPE` int(10) unsigned DEFAULT NULL,  `SPACE` int(10) unsigned DEFAULT NULL,  存儲索引的表空間id  `PAGE_NO` int(10) unsigned DEFAULT NULL,  索引的root page id  PRIMARY KEY (`TABLE_ID`,`ID`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;SYS_COLUMNS 描述 InnoDB 表的字段信息CREATE TABLE `SYS_COLUMNS` (  `TABLE_ID` bigint(20) unsigned NOT NULL, 與sys_tables的id對應  `POS` int(10) unsigned NOT NULL,     字段相對位置  `NAME` varchar(255) DEFAULT NULL,    字段名稱  `MTYPE` int(10) unsigned DEFAULT NULL,  字段編碼  `PRTYPE` int(10) unsigned DEFAULT NULL, 字段校驗類型  `LEN` int(10) unsigned DEFAULT NULL,  字段字節長度  `PREC` int(10) unsigned DEFAULT NULL, 字段精度  PRIMARY KEY (`TABLE_ID`,`POS`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;SYS_FIELDS 描述全部索引的字段列CREATE TABLE `SYS_FIELDS` (  `INDEX_ID` bigint(20) unsigned NOT NULL,  `POS` int(10) unsigned NOT NULL,  `COL_NAME` varchar(255) DEFAULT NULL,  PRIMARY KEY (`INDEX_ID`,`POS`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;./storage/innobase/include/dict0boot.h 文件定義了每個字典表的 index id,對應 id 的 page 中存儲着字典表的數據。

這裡我們需要藉助 undrop-for-innodb 工具恢複數據,它能讀取表空間信息得到 page,將數據從 page 中提取出來。

# wget yum install -y gcc flex bison# make# make sys_parser

# ./sys_parser 讀取表結構信息

sys_parser [-h] [-u] [-p] [-d] databases/table

stream_parser 讀取 InnoDB page 從 ibdata1 或 ibd 或分區表

# ./stream_parserYou must specify file with -f optionUsage: ./stream_parser -f innodb_datafile [-T N:M] [-s size] [-t size] [-V|-g]  Where:    -h         – Print this help    -V or -g   – Print debug information    -s size    – Amount of memory used for disk cache (allowed examples 1G 10M). Default 100M    -T         – retrieves only pages with index id = NM (N – high word, M – low word of id)    -t size    – Size of InnoDB tablespace to scan. Use it only if the parser can’t determine it by himself.

c_parser 從 innodb page 中讀取記錄保存到文件

# ./c_parserError: Usage: ./c_parser -4|-5|-6 [-dDV] -f InnoDB page or dir -t table.sql [-T N:M] [-b external pages directory]  Where    -f InnoDB page(s) — InnoDB page or directory with pages(all pages should have same index_id)    -t table.sql — CREATE statement of a table    -o file — Save dump in this file. Otherwise print to stdout    -l file — Save SQL statements in this file. Otherwise print to stderr    -h  — Print this help    -d  — Process only those pages which potentially could have deleted records (default = NO)    -D  — Recover deleted rows only (default = NO)    -U  — Recover UNdeleted rows only (default = YES)    -V  — Verbose mode (lots of debug information)    -4  — innodb_datafile is in REDUNDANT format    -5  — innodb_datafile is in COMPACT format    -6  — innodb_datafile is in MySQL 5.6 format    -T  — retrieves only pages with index id = NM (N – high word, M – low word of id)    -b dir — Directory where external pages can be found. Usually it is pages-XXX/FIL_PAGE_TYPE_BLOB/    -i file — Read external pages at their offsets from file.    -p prefix — Use prefix for a directory name in LOAD DATA INFILE command

接下來,我們演示場景的幾種數據恢復場景。

場景1:drop table

是否啟用了 innodb_file_per_table 其恢復方法有所差異,當發生誤刪表時,應儘快停止MySQL服務,不要啟動。若 innodb_file_per_table=ON,最好只讀方式重新掛載文件系統,防止其他進程寫入數據覆蓋之前塊設備的數據。

如果評估記錄是否被覆蓋,可以表中某些記錄的作為關鍵字看是否能從 ibdata1 中篩選出。

# grep WOODYHOFFMAN ibdata1

Binary file ibdata1 matches

也可以使用 bvi(適用於較小文件)或 hexdump -C(適用於較大文件)工具

以表 sakila.actor 為例CREATE TABLE `actor` (`actor_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,`first_name` varchar(45) NOT NULL,`last_name` varchar(45) NOT NULL,`last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,PRIMARY KEY (`actor_id`),KEY `idx_actor_last_name` (`last_name`)) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=utf8

首先恢復表結構信息1. 解析系統表空間獲取 page 信息

./stream_parser -f /var/lib/mysql/ibdata1

2. 新建一個 schema,把系統字典表的 DDL 導入

cat dictionary/SYS_* | mysql recovered

3. 創建恢複目錄

mkdir -p dumps/default

4. 解析系統表空間包含的字典表信息,

./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000001.page -t dictionary/SYS_TABLES.sql dumps/default/SYS_TABLES 2 dumps/default/SYS_TABLES.sql./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000002.page -t dictionary/SYS_COLUMNS.sql dumps/default/SYS_COLUMNS 2 dumps/default/SYS_COLUMNS.sql./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000003.page -t dictionary/SYS_INDEXES.sql dumps/default/SYS_INDEXES 2 dumps/default/SYS_INDEXES.sql./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000004.page -t dictionary/SYS_FIELDS.sql dumps/default/SYS_FIELDS 2 dumps/default/SYS_FIELDS.sql

5. 導入恢復的數據字典

cat dumps/default/*.sql | mysql recovered

6. 讀取恢復後的表結構信息

./sys_parser -pmsandbox -d recovered sakila/actor

由於 5.x 版本 innodb 引擎並非完整記錄表結構信息,會丟失 AUTO_INCREMENT 屬性、二級索引和外鍵約束, DECIMAL 精度等信息。

若是 mysql 5.5 版本 frm 文件被從系統刪除,在原目錄下 touch 與原表名相同的 frm 文件,還能讀取表結構信息和數據。若只有 frm 文件,想要獲得表結構信息,可使用 mysqlfrm –diagnostic /path/to/xxx.frm,連接 mysql 會顯示字符集信息。

innodb_file_per_table=OFF

因為是共享表空間模式,數據頁都存儲在 ibdata1,可以從 ibdata1 文件中提取數據。

1. 獲取表的 table id,sys_table 存有表的 table id,sys_table 表 index id 是1,所以從0000000000000001.page 獲取表 id./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000001.page -t dictionary/SYS_TABLES.sql | grep sakila/actor000000000B28  2A000001430D4D  SYS_TABLES  “sakila/actor”  158  4  1 0   0   “”  0000000000B28  2A000001430D4D  SYS_TABLES  “sakila/actor”  158  4  1 0   0   “”  0

2. 利用 table id 獲取表的主鍵 id,sys_indexes 存有表索引信息,innodb 索引組織表,找到主鍵 id 即找到數據,sys_indexes 的 index id 是3,所以從0000000000000003.page 獲取主鍵 id

./c_parser -4Df pages-ibdata1/FIL_PAGE_INDEX/0000000000000003.page -t dictionary/SYS_INDEXES.sql | grep 158000000000B28    2A000001430BCA  SYS_INDEXES     158     376     “PRIMARY”       1       3       0       4294967295000000000B28    2A000001430C3C  SYS_INDEXES     158     377     “idx_actor_last_name”        1       0       0       4294967295000000000B28    2A000001430BCA  SYS_INDEXES     158     376     “PRIMARY”       1       3       0       4294967295000000000B28    2A000001430C3C  SYS_INDEXES     158     377     “idx_actor_last_name”        1       0       0       4294967295

3. 知道了主鍵 id,就可以從對應 page 中提取表數據,並生成 sql 文件。

./c_parser -4f pages-ibdata1/FIL_PAGE_INDEX/0000000000000376.page -t sakila/actor.sql dumps/default/actor 2 dumps/default/actor_load.sql

4. 最後導入恢復的數據

cat dumps/default/*.sql | mysql sakila

更多詳細情況點擊

網頁鏈接

請點擊輸入圖片描述

數據庫(mysql)關鍵知識

Mysql是目前互聯網使用最廣的關係數據庫,關係數據庫的本質是將問題分解為多個分類然後通過關係來查詢。 一個經典的問題是用戶借書,三張表,一個用戶,一個書,一個借書的關係表。當需要查詢某個用戶借書情況或者是書被那些人借了,就用關係查詢來實現。

關係數據庫範式

來自英文Normal form,簡稱NF。要想設計—個好的關係,必須使關係滿足一定的約束條件,滿足這些規範的數據庫是簡潔的、結構明晰的,同時,不會發生插入(insert)、刪除(delete)和更新(update)操作異常。總共有六種範式:第一範式(1NF)、第二範式(2NF)、 第三範式 (3NF)、巴斯-科德範式(BCNF)、 第四範式 (4NF)和 第五範式 (5NF,又稱完美範式)。

1NF是指數據庫表的每一列都是不可分割的原子數據項。2NF必須滿足1NF,要求數據庫表中的每行記錄必須可以被唯一地區分。3NF在2NF基礎上,任何非主 屬性 不依賴於其它非主屬性(在2NF基礎上消除傳遞依賴)。BCNF是在3NF基礎上,任何非主屬性不能對主鍵子集依賴(在3NF基礎上消除對主碼子集的依賴), 滿足BCNF不再會有任何由於函數依賴導致的異常,但是我們還可能會遇到由於多值依賴導致的異常。4NF的定義很簡單:已經是BC範式,並且不包含多值依賴關係。5NF處理的是無損連接問題,這個範式基本沒有實際意義,因為無損連接很少出現,而且難以察覺。而域鍵範式試圖定義一個終極範式,該範式考慮所有的依賴和約束類型,但是實用價值也是最小的,只存在理論研究中。

Catalog和Schema

是數據庫對象命名空間中的層次,主要用來解決命名衝突的問題。從概念上說,一個數據庫系統包含多個Catalog,每個Catalog又包含多個Schema,而每個Schema又包含多個數據庫對象(表、視圖、字段等)。但是Mysql的數據庫名就是Schema,不支持Catalog。

Mysql的數據庫引擎主要有兩種MyISAM和InnoDB,MyISAM支持全文檢索,InnoDB支持事務。

SQL中的通配符‘%’代表任意字符出現任意次數。‘_’代表任意字符出現一次。SQL與正則表達式結合查詢一般用在WHERE table_name REGEXP ‘^12.34’。子查詢是從裡到外執行。

數據庫聯結(join)涉及到外鍵,外鍵是指一個表的列是另一個表的主鍵,那麼它就是外鍵。笛卡爾積聯結(不指定聯結條件時)生成的記錄條目是單純的第一個表的行乘以第二個表的列數。用得最多的是等值聯結也叫內部聯結。

高級聯結還有自連接,是指查詢中的兩張表是同一張表,它通常作為外部語句用來代替從相同表中檢索數據時使用的子查詢。自然聯結使每個列只返回一次。外部聯結是指聯結包含了那些在相關表中沒有關聯行的行。例如列出所有產品及其訂購數量,包括沒有人訂購的產品。LEFT OUTER JOIN指選擇左邊表的所有行。

組合查詢是指採用UNION等將兩個查詢結果取並集。

視圖是查看存儲在別處的數據的一種工具,它本身並不包含數據,因此表的數據修改了,視圖返回的數據也將隨之修改,因此如果使用了複雜或嵌套視圖會對性能有較大的影響。視圖的作用之一是隱藏複雜的SQL通常會涉及到聯結查詢。

存儲過程類似於批處理,包含了一條或多條SQL語句。語法:

CREATE PROCEDURE name()

BEGIN

SQL

END

————————-

CALL name()//來調用存儲過程

游標有DECLARE定義,游標與存儲過程是綁定的,存儲過程處理完成,游標就會消失。游標被打開後可以使用FETCH語句訪問每一行。

觸發器是在某個時間發生時自動執行某條SQL語句。語法:

CREATE TRIGGER name AFTER INSERT ON talbe_name FOR EACH ROW

事務處理可以維護數據庫的完整性,保證批量的操作要麼完全執行,要麼完全不執行。包括事務、回退、提交、保留點幾個關鍵術語。ROLLBACK只能在一個事務處理內使用。他不能回退CREATE和DROP操作。使用COMMIT保證事務提交。複雜的事務處理需要部分提交或回退,因此我們需要使用保留點SAVEPOINT。可以使用ROLLBACK TO savepoint_name。保留點越多越好。保留點在事務執行完成後自動釋放。

mysql還原數據庫

簡單情況下:進入原來mysql安裝路徑下的data文件夾下,找到相應的庫和ibdata1,進行copy,就可回復原來的數據。

複雜情況下:

從另一台機上把MySQL數據庫的mysql文件夾拷貝到本地機上,目的是恢複本地機對數據的訪問和操作。經過如下幾種情況的操作。

1. 在本地重裝MySQL(安裝目錄D:\Program Files\MySQL\MySQL Server 5.0),直接把mysql文件夾拷貝至D:\Program Files\MySQL\MySQL Server 5.0\。結果,失敗:數據庫連接錯誤。

2. 卸載後重裝MySQL,將D:\Program Files\MySQL\MySQL Server 5.0\下的數據備份,只把mysql\data文件夾全部內容拷貝到D:\Program Files\MySQL\MySQL Server 5.0\data下。結果,失敗:數據庫連接錯誤。將備份的數據還完覆蓋。結果,失敗,還是連接不上數據庫。

3. 卸載後重裝MySQL,將mysql\data文件夾里的cf1,last文件夾(這兩個是原來MySQL里的數據庫)拷貝進D:\Program Files\MySQL\MySQL Server 5.0\data。連接成功,在Navicat for MySQL里看到數據庫cf1和last,但是不能訪問,因為數據全為零。明白了原來data里以數據庫命名的文件存儲的是數據庫的表結構,不是元數據。下一步,把data文件夾里的ibdata1文件(3.4G大,明顯存儲了元數據)拷貝到D:\Program Files\MySQL\MySQL Server 5.0\data里,代替原來的ibdata1文件。重啟電腦,打開Navicat for MySQL,連接成功,數據可以訪問操作。

至此,操作終於成功。其實當初在那台機上把數據導出來,而不是現在直接把文件夾mysql複製過來會更容易恢復。但那台機已經重裝了系統,也就是說MySQL失效了。

mysql中備份和還原數據庫的語句什麼啊

一、Mysql數據庫備份指令格式:

mysqldump -h主機名 -P端口 -u用戶名 -p密碼 (–database) 數據庫名 文件名.sql

註:直接cmd執行該指令即可,不需要先mysql -u root -p鏈接數據庫

1、備份MySQL數據庫的命令

mysqldump -hhostname -uusername -ppassword databasename backupfile.sql

2、備份MySQL數據庫為帶刪除表的格式,能夠讓該備份覆蓋已有數據庫而不需要手動刪除原有數據庫。

mysqldump -–add-drop-table -uusername -ppassword databasename backupfile.sql

二、數據庫還原有三種方式:source命令、mysql、gunzip命令

1、source 命令

進入mysql數據庫控制台,

mysql -u root -p

mysqluse 數據庫

然後使用source命令,後面參數為腳本文件(如這裡用到的.sql)

mysqlsource /home/work/db/bkdb.sql

2、mysql

mysql -hhostname -uusername -ppassword databasename backupfile.sql

3、gunzip

gunzip backupfile.sql.gz | mysql -uusername -ppassword databasename

mysql 命令還原數據庫

mysqldump -hhostname -uusername -ppassword databasename backupfile.sql備份MySQL數據庫為帶刪除表的格式備份MySQL數據庫為帶刪除表的格式,能夠讓該備份覆蓋已有數據庫而不需要手動刪除原有數據庫。

mysqldump -–add-drop-table -uusername -ppassword databasename backupfile.sql直接將MySQL數據庫壓縮備份

mysqldump -hhostname -uusername -ppassword databasename | gzip backupfile.sql.gz備份MySQL數據庫某個(些)表

mysqldump -hhostname -uusername -ppassword databasename specific_table1 specific_table2 backupfile.sql同時備份多個MySQL數據庫

mysqldump -hhostname -uusername -ppassword –databases databasename1 databasename2 databasename3 multibackupfile.sql僅僅備份數據庫結構

mysqldump –no-data –databases databasename1 databasename2 databasename3 structurebackupfile.sql備份服務器上所有數據庫

mysqldump –all-databases allbackupfile.sql還原MySQL數據庫的命令

mysql -hhostname -uusername -ppassword databasename backupfile.sql還原壓縮的MySQL數據庫

gunzip backupfile.sql.gz | mysql -uusername -ppassword databasename將數據庫轉移到新服務器

mysqldump -uusername -ppassword databasename | mysql –host=*.*.*.* -C databasename

mysql數據庫

MySQL數據庫一般指MySQL,MySQL是一個關係型數據庫管理系統,由瑞典MySQL AB 公司開發。

mysql是目前網站以及APP應用上用得較多的一個開源的關係型數據庫系統,可以對數據進行保存,分段化的數據保存,也可以對其數據進行檢索,查詢等功能的數據庫。

默認的mysql數據庫中存有一個庫這個就是mysql的系統數據庫,可以對其保存系統的數據包括mysql數據庫的信息,數據庫root賬號,普通賬號,以及數據庫的名稱,還有數據庫的一些表還有一些數字型的數據類型結構都會有所保存。

mysql數據庫的優點

(1)MySQL數據庫是用C和C++語言編寫的,並且使用了多種編輯器進行測試,以保證源碼的可移植性。

(2)支持多個操作系統例如:Windows、Linux、Mac OS等等。

(3)支持多線程,可以充分的利用CPU資源。

(4)為多種編程語言提供API,包括C語言、Java、PHP、Python語言等。

(5)MySQL優化了SQL算法,有效的提高了查詢速度。

(6)MySQL內提供了用於管理,檢查以及優化數據庫操作的管理工具。

(7)它能夠作為一個單獨的應用程序應用在客戶端服務器網絡環境中,也可以作為一個庫嵌入到其他的軟件中並提供多種語言支持。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/296002.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-27 12:57
下一篇 2024-12-27 12:57

相關推薦

  • 如何修改mysql的端口號

    本文將介紹如何修改mysql的端口號,方便開發者根據實際需求配置對應端口號。 一、為什麼需要修改mysql端口號 默認情況下,mysql使用的端口號是3306。在某些情況下,我們需…

    編程 2025-04-29
  • Python 常用數據庫有哪些?

    在Python編程中,數據庫是不可或缺的一部分。隨着互聯網應用的不斷擴大,處理海量數據已成為一種趨勢。Python有許多成熟的數據庫管理系統,接下來我們將從多個方面介紹Python…

    編程 2025-04-29
  • openeuler安裝數據庫方案

    本文將介紹在openeuler操作系統中安裝數據庫的方案,並提供代碼示例。 一、安裝MariaDB 下面介紹如何在openeuler中安裝MariaDB。 1、更新軟件源 sudo…

    編程 2025-04-29
  • Python操作MySQL

    本文將從以下幾個方面對Python操作MySQL進行詳細闡述: 一、連接MySQL數據庫 在使用Python操作MySQL之前,我們需要先連接MySQL數據庫。在Python中,我…

    編程 2025-04-29
  • 數據庫第三範式會有刪除插入異常

    如果沒有正確設計數據庫,第三範式可能導致刪除和插入異常。以下是詳細解釋: 一、什麼是第三範式和範式理論? 範式理論是關係數據庫中的一個規範化過程。第三範式是範式理論中的一種常見形式…

    編程 2025-04-29
  • MySQL遞歸函數的用法

    本文將從多個方面對MySQL遞歸函數的用法做詳細的闡述,包括函數的定義、使用方法、示例及注意事項。 一、遞歸函數的定義 遞歸函數是指在函數內部調用自身的函數。MySQL提供了CRE…

    編程 2025-04-29
  • leveldb和unqlite:兩個高性能的數據庫存儲引擎

    本文將介紹兩款高性能的數據庫存儲引擎:leveldb和unqlite,並從多個方面對它們進行詳細的闡述。 一、leveldb:輕量級的鍵值存儲引擎 1、leveldb概述: lev…

    編程 2025-04-28
  • Python怎麼導入數據庫

    Python是一種高級編程語言。它具有簡單、易讀的語法和廣泛的庫,讓它成為一個靈活和強大的工具。Python的數據庫連接類型可以多種多樣,其中包括MySQL、Oracle、Post…

    編程 2025-04-28
  • MySQL bigint與long的區別

    本文將從數據類型定義、存儲空間、數據範圍、計算效率、應用場景五個方面詳細闡述MySQL bigint與long的區別。 一、數據類型定義 bigint在MySQL中是一種有符號的整…

    編程 2025-04-28
  • MySQL左連接索引不生效問題解決

    在MySQL數據庫中,經常會使用左連接查詢操作,但是左連接查詢中索引不生效的情況也比較常見。本文將從多個方面探討MySQL左連接索引不生效問題,並給出相應的解決方法。 一、索引的作…

    編程 2025-04-28

發表回復

登錄後才能評論