mysql資料庫簡單的知識點(資料庫mysql知識點整理)

本文目錄一覽:

Mysql資料庫的基本問題

親,你看看你這句COUNT(id) as num,SUM(num) as zongshu

你確定,num是你資料庫里的欄位?如果是欄位你為什麼要 as別名成num

如果num是別名,你SUM(num) as zongshu 。就會提示錯誤

因為num根本就不是欄位,而只是個你臨時命名的別名,所以報錯是理所當然的。

能理解嗎?不懂繼續追問

MySQL知識點總結

只要欄位值還可以繼續拆分,就不滿足第一範式。

範式設計得越詳細,對某些實際操作可能會更好,但並非都有好處,需要對項目的實際情況進行設定。

在滿足第一範式的前提下,其他列都必須完全依賴於主鍵列。 如果出現不完全依賴,只可能發生在聯合主鍵的情況下:

實際上,在這張訂單表中,product_name 只依賴於 product_id ,customer_name 只依賴於 customer_id。也就是說,product_name 和 customer_id 是沒用關係的,customer_name 和 product_id 也是沒有關係的。

這就不滿足第二範式:其他列都必須完全依賴於主鍵列!

拆分之後,myorder 表中的 product_id 和 customer_id 完全依賴於 order_id 主鍵,而 product 和 customer 表中的其他欄位又完全依賴於主鍵。滿足了第二範式的設計!

在滿足第二範式的前提下,除了主鍵列之外,其他列之間不能有傳遞依賴關係。

表中的 customer_phone 有可能依賴於 order_id 、 customer_id 兩列,也就不滿足了第三範式的設計:其他列之間不能有傳遞依賴關係。

修改後就不存在其他列之間的傳遞依賴關係,其他列都只依賴於主鍵列,滿足了第三範式的設計!

查詢每門課的平均成績。

查詢 score 表中至少有 2 名學生選修,並以 3 開頭的課程的平均分數。

分析表發現,至少有 2 名學生選修的課程是 3-105 、3-245 、6-166 ,以 3 開頭的課程是 3-105 、3-245。也就是說,我們要查詢所有 3-105 和 3-245 的 degree 平均分。

查詢所有學生的 name,以及該學生在 score 表中對應的 c_no 和 degree 。

通過分析可以發現,只要把 score 表中的 s_no 欄位值替換成 student 表中對應的 name 欄位值就可以了,如何做呢?

查詢所有學生的 no 、課程名稱 ( course 表中的 name ) 和成績 ( score 表中的 degree ) 列。

只有 score 關聯學生的 no ,因此只要查詢 score 表,就能找出所有和學生相關的 no 和 degree :

然後查詢 course 表:

只要把 score 表中的 c_no 替換成 course 表中對應的 name 欄位值就可以了。

查詢所有學生的 name 、課程名 ( course 表中的 name ) 和 degree 。

只有 score 表中關聯學生的學號和課堂號,我們只要圍繞著 score 這張表查詢就好了。

只要把 s_no 和 c_no 替換成 student 和 srouse 表中對應的 name 欄位值就好了。

首先把 s_no 替換成 student 表中的 name 欄位:

再把 c_no 替換成 course 表中的 name 欄位:

查詢 95031 班學生每門課程的平均成績。

在 score 表中根據 student 表的學生編號篩選出學生的課堂號和成績:

這時只要將 c_no 分組一下就能得出 95031 班學生每門課的平均成績:

查詢在 3-105 課程中,所有成績高於 109 號同學的記錄。

首先篩選出課堂號為 3-105 ,在找出所有成績高於 109 號同學的的行。

查詢所有成績高於 109 號同學的 3-105 課程成績記錄。

查詢所有和 101 、108 號學生同年出生的 no 、name 、birthday 列。

查詢 ‘張旭’ 教師任課的學生成績表。

首先找到教師編號:

通過 sourse 表找到該教師課程號:

通過篩選出的課程號查詢成績表:

查詢某選修課程多於5個同學的教師姓名。

首先在 teacher 表中,根據 no 欄位來判斷該教師的同一門課程是否有至少5名學員選修:

查看和教師編號有有關的表的信息:

我們已經找到和教師編號有關的欄位就在 course 表中,但是還無法知道哪門課程至少有5名學生選修,所以還需要根據 score 表來查詢:

根據篩選出來的課程號,找出在某課程中,擁有至少5名學員的教師編號:

在 teacher 表中,根據篩選出來的教師編號找到教師姓名:

查詢 「計算機系」 課程的成績表。

思路是,先找出 course 表中所有 計算機系 課程的編號,然後根據這個編號查詢 score 表。

查詢 計算機系 與 電子工程系 中的不同職稱的教師。

查詢課程 3-105 且成績 至少 高於 3-245 的 score 表。

查詢課程 3-105 且成績高於 3-245 的 score 表。

查詢某課程成績比該課程平均成績低的 score 表。

查詢所有任課 ( 在 course 表裡有課程 ) 教師的 name 和 department 。

查詢 student 表中至少有 2 名男生的 class 。

查詢 student 表中不姓 “王” 的同學記錄。

查詢 student 表中每個學生的姓名和年齡。

查詢 student 表中最大和最小的 birthday 值。

以 class 和 birthday 從大到小的順序查詢 student 表。

查詢 “男” 教師及其所上的課程。

查詢最高分同學的 score 表。

查詢和 “李軍” 同性別的所有同學 name 。

查詢和 “李軍” 同性別且同班的同學 name 。

查詢所有選修 “計算機導論” 課程的 “男” 同學成績表。

需要的 “計算機導論” 和性別為 “男” 的編號可以在 course 和 student 表中找到。

建立一個 grade 表代表學生的成績等級,並插入數據:

查詢所有學生的 s_no 、c_no 和 grade 列。

思路是,使用區間 ( BETWEEN ) 查詢,判斷學生的成績 ( degree ) 在 grade 表的 low 和 upp 之間。

準備用於測試連接查詢的數據:

分析兩張表發現,person 表並沒有為 cardId 欄位設置一個在 card 表中對應的 id 外鍵。如果設置了的話,person 中 cardId 欄位值為 6 的行就插不進去,因為該 cardId 值在 card 表中並沒有。

要查詢這兩張表中有關係的數據,可以使用 INNER JOIN ( 內連接 ) 將它們連接在一起。

完整顯示左邊的表 ( person ) ,右邊的表如果符合條件就顯示,不符合則補 NULL 。

完整顯示右邊的表 ( card ) ,左邊的表如果符合條件就顯示,不符合則補 NULL 。

完整顯示兩張表的全部數據。

在 MySQL 中,事務其實是一個最小的不可分割的工作單元。事務能夠 保證一個業務的完整性 。

比如我們的銀行轉賬:

在實際項目中,假設只有一條 SQL 語句執行成功,而另外一條執行失敗了,就會出現數據前後不一致。

因此,在執行多條有關聯 SQL 語句時, 事務 可能會要求這些 SQL 語句要麼同時執行成功,要麼就都執行失敗。

在 MySQL 中,事務的 自動提交 狀態默認是開啟的。

自動提交的作用 :當我們執行一條 SQL 語句的時候,其產生的效果就會立即體現出來,且不能 回滾 。

什麼是回滾?舉個例子:

可以看到,在執行插入語句後數據立刻生效,原因是 MySQL 中的事務自動將它 提交 到了資料庫中。那麼所謂 回滾 的意思就是,撤銷執行過的所有 SQL 語句,使其回滾到 最後一次提交 數據時的狀態。

在 MySQL 中使用 ROLLBACK 執行回滾:

由於所有執行過的 SQL 語句都已經被提交過了,所以數據並沒有發生回滾。那如何讓數據可以發生回滾?

將自動提交關閉後,測試數據回滾:

那如何將虛擬的數據真正提交到資料庫中?使用 COMMIT :

事務的實際應用 ,讓我們再回到銀行轉賬項目:

這時假設在轉賬時發生了意外,就可以使用 ROLLBACK 回滾到最後一次提交的狀態:

這時我們又回到了發生意外之前的狀態,也就是說,事務給我們提供了一個可以反悔的機會。假設數據沒有發生意外,這時可以手動將數據真正提交到數據表中:COMMIT 。

事務的默認提交被開啟 ( @@AUTOCOMMIT = 1 ) 後,此時就不能使用事務回滾了。但是我們還可以手動開啟一個事務處理事件,使其可以發生回滾:

仍然使用 COMMIT 提交數據,提交後無法再發生本次事務的回滾。

事務的四大特徵:

事務的隔離性可分為四種 ( 性能從低到高 ) :

查看當前資料庫的默認隔離級別:

修改隔離級別:

測試 READ UNCOMMITTED ( 讀取未提交 ) 的隔離性:

由於小明的轉賬是在新開啟的事務上進行操作的,而該操作的結果是可以被其他事務(另一方的淘寶店)看見的,因此淘寶店的查詢結果是正確的,淘寶店確認到賬。但就在這時,如果小明在它所處的事務上又執行了 ROLLBACK 命令,會發生什麼?

這就是所謂的 臟讀 ,一個事務讀取到另外一個事務還未提交的數據。這在實際開發中是不允許出現的。

把隔離級別設置為 READ COMMITTED :

這樣,再有新的事務連接進來時,它們就只能查詢到已經提交過的事務數據了。但是對於當前事務來說,它們看到的還是未提交的數據,例如:

但是這樣還有問題,那就是假設一個事務在操作數據時,其他事務干擾了這個事務的數據。例如:

雖然 READ COMMITTED 讓我們只能讀取到其他事務已經提交的數據,但還是會出現問題,就是 在讀取同一個表的數據時,可能會發生前後不一致的情況。* 這被稱為* 不可重複讀現象 ( READ COMMITTED ) 。

將隔離級別設置為 REPEATABLE READ ( 可被重複讀取 ) :

測試 REPEATABLE READ ,假設在兩個不同的連接上分別執行 START TRANSACTION :

當前事務開啟後,沒提交之前,查詢不到,提交後可以被查詢到。但是,在提交之前其他事務被開啟了,那麼在這條事務線上,就不會查詢到當前有操作事務的連接。相當於開闢出一條單獨的線程。

無論小張是否執行過 COMMIT ,在小王這邊,都不會查詢到小張的事務記錄,而是只會查詢到自己所處事務的記錄:

這是 因為小王在此之前開啟了一個新的事務 ( START TRANSACTION ) * ,那麼* 在他的這條新事務的線上,跟其他事務是沒有聯繫的 ,也就是說,此時如果其他事務正在操作數據,它是不知道的。

然而事實是,在真實的數據表中,小張已經插入了一條數據。但是小王此時並不知道,也插入了同一條數據,會發生什麼呢?

報錯了,操作被告知已存在主鍵為 6 的欄位。這種現象也被稱為 幻讀,一個事務提交的數據,不能被其他事務讀取到 。

顧名思義,就是所有事務的 寫入操作 全都是串列化的。什麼意思?把隔離級別修改成 SERIALIZABLE :

還是拿小張和小王來舉例:

此時會發生什麼呢?由於現在的隔離級別是 SERIALIZABLE ( 串列化 ) ,串列化的意思就是:假設把所有的事務都放在一個串列的隊列中,那麼所有的事務都會按照 固定順序執行 ,執行完一個事務後再繼續執行下一個事務的 寫入操作 ( 這意味著隊列中同時只能執行一個事務的寫入操作 ) 。

根據這個解釋,小王在插入數據時,會出現等待狀態,直到小張執行 COMMIT 結束它所處的事務,或者出現等待超時。

轉載:

有資料庫基礎,如何快速精通mysql?

本周內容:455字

閱讀時間:3~5分鐘

前言

MySQL 是一款免費開源、小型、關係型資料庫管理系統。隨著該資料庫功能不斷完善、性能的不斷提高,可靠性不斷增強。它雖然是免費,但與其他商業資料庫一樣,具有資料庫系統的通用性,提供了資料庫的存取、增加、修改、刪除或更加複雜的操作。同時MySQL所使用的 SQL 語言是用於訪問資料庫的最常用標準化語言。MySQL 軟體採用了雙授權政策,分為社區版和商業版,由於其體積小、速度快、總體擁有成本低,尤其是開放源碼這一特點,一般中小型網站的開發都選擇 MySQL 作為網站資料庫。

下面開始介紹搭建的過程

一、準備環境

系統:

Centos 6.5_64

二、安裝過程

1.yum -y install mysql-server

2.設置服務開機啟動

3.啟動資料庫服務

4.設置MySQLroot用戶

5.設置root用戶密碼為

6.登錄資料庫

7.創建資料庫test1

8.建立資料庫表格,xm姓名,xb性別,csny出生年齡

9增加資料庫條目記錄,姓名:李一,性別:男年齡:1988.9.01

書籍推薦

《MySQL 5.7從入門到精通》

本書主要包括MySQL的安裝與配置、資料庫的創建、數據表的創建、數據類型和運算符、MySQL函數、查詢數據、數據表的操作(插入、更新與刪除數據)、索引、存儲過程和函數、視圖、觸發器、用戶管理、數據備份與恢復、日誌以及性能優化等。最後通過兩個綜合案例的資料庫設計,進一步講述MySQL在實際工作中的應用。

本書注重實戰操作,幫助讀者循序漸進地掌握MySQL中的各項技術。本書共有480個實例和14個綜合案例,還有大量的經典習題。下載文件中贈送了近20小時培訓班形式的視頻教學錄像,詳細講解了書中每一個知識點和每一個資料庫操作的方法和技巧。同時下載文件中還提供了本書所有例子的源代碼,讀者可以直接查看和調用。

本書適合MySQL資料庫初學者、MySQL資料庫開發人員和MySQL資料庫管理員,同時也能作為高等院校相關專業師生的教學用書。

讓閱讀成為習慣

MYSQL資料庫的作用是什麼

資料庫的作用是將各種數據有序的管理起來,並對其他應用提供統一的介面和服務。

資料庫是以一定方式儲存在一起、能與多個用戶共享、具有儘可能小的冗餘度、與應用程序彼此獨立的數據集合,可視為電子化的文件櫃——存儲電子文件的處所,用戶可以對文件中的數據進行新增、查詢、更新、刪除等操作。

資料庫是存放數據的倉庫。它的存儲空間很大,可以存放百萬條、千萬條、上億條數據。但是資料庫並不是隨意地將數據進行存放,是有一定的規則的,否則查詢的效率會很低。

當今世界是一個充滿著數據的互聯網世界,充斥著大量的數據。即這個互聯網世界就是數據世界。數據的來源有很多,比如出行記錄、消費記錄、瀏覽的網頁、發送的消息等等。除了文本類型的數據,圖像、音樂、聲音都是數據。

擴展資料

發展現狀

在資料庫的發展歷史上,資料庫先後經歷了層次資料庫、網狀資料庫和關係資料庫等各個階段的發展,資料庫技術在各個方面的快速的發展。特別是關係型資料庫已經成為目前資料庫產品中最重要的一員。

80年代以來, 幾乎所有的資料庫廠商新出的資料庫產品都支持關係型資料庫,即使一些非關係資料庫產品也幾乎都有支持關係資料庫的介面。這主要是傳統的關係型資料庫可以比較好的解決管理和存儲關係型數據的問題。

隨著雲計算的發展和大數據時代的到來,關係型資料庫越來越無法滿足需要,這主要是由於越來越多的半關係型和非關係型數據需要用資料庫進行存儲管理,以此同時,分散式技術等新技術的出現也對資料庫的技術提出了新的要求,於是越來越多的非關係型資料庫就開始出現。

這類資料庫與傳統的關係型資料庫在設計和數據結構有了很大的不同, 它們更強調資料庫數據的高並發讀寫和存儲大數據,這類資料庫一般被稱為NoSQL(Not only SQL)資料庫。 而傳統的關係型資料庫在一些傳統領域依然保持了強大的生命力。

MYSQL資料庫的特性急求

是事務的特性吧

事務有四大特性,一般來講,判斷一個資料庫是否支持事務,就看資料庫是否支持這四個特性

原子性(Atomicity)

原子性是指事務是一個不可分割的工作單位,事務中的操作要麼都發生,要麼都不發生。

一致性(Consistency)

事務必須使資料庫從一個一致性狀態變換到另外一個一致性狀態。

隔離性(Isolation)

事務的隔離性是多個用戶並發訪問資料庫時,資料庫為每一個用戶開啟的事務,不能被其他事務的操作數據所干擾,多個並發事務之間要相互隔離。

持久性(Durability)

持久性是指一個事務一旦被提交,它對資料庫中數據的改變就是永久性的,接下來即使資料庫發生故障也不應該對其有任何影響。

什麼是MySql資料庫

 MySQL資料庫:

MySQL是一種開放源代碼的關係型資料庫管理系統(RDBMS),使用最常用的資料庫管理語言–結構化查詢語言(SQL)進行資料庫管理。

MySQL是開放源代碼的,因此任何人都可以在General Public License的許可下下載並根據個性化的需要對其進行修改。

MySQL因為其速度、可靠性和適應性而備受關注。大多數人都認為在不需要事務化處理的情況下,MySQL是管理內容最好的選擇。

資料庫簡介:

MySQL是一種開放源代碼的關係型資料庫管理系統(RDBMS),MySQL資料庫系統使用最常用的資料庫管理語言–結構化查詢語言(SQL)進行資料庫管理。

由於MySQL是開放源代碼的,因此任何人都可以在General Public License的許可下下載並根據個性化的需要對其進行修改。MySQL因為其速度、可靠性和適應性而備受關注。大多數人都認為在不需要事務化處理的情況下,MySQL是管理內容最好的選擇。

MySQL這個名字,起源不是很明確。一個比較有影響的說法是,基本指南和大量的庫和工具帶有前綴「my」已經有10年以上,而且不管怎樣,MySQL AB創始人之一的Monty Widenius的女兒也叫My。這兩個到底是哪一個給出了MySQL這個名字至今依然是個迷,包括開發者在內也不知道。

MySQL的海豚標誌的名字叫「sakila」,它是由MySQL AB的創始人從用戶在「海豚命名」的競賽中建議的大量的名字表中選出的。獲勝的名字是由來自非洲史瓦濟蘭的開源軟體開發者Ambrose Twebaze提供。根據Ambrose所說,Sakila來自一種叫SiSwati的史瓦濟蘭方言,也是在Ambrose的家鄉烏干達附近的坦尚尼亞的Arusha的一個小鎮的名字。

MySQL,雖然功能未必很強大,但因為它的開源、廣泛傳播,導致很多人都了解到這個資料庫。它的歷史也富有傳奇性。

MySQL資料庫歷史:

MySQL的歷史最早可以追溯到1979年,那時Oracle也才小打小鬧,微軟的SQL Server影子都沒有。有一個人叫Monty Widenius, 為一個叫TcX的小公司打工,並用BASIC設計了一個報表工具,可以在4M主頻和16KB內存的計算機上運行。過了不久,又將此工具,使用C語言重寫,移植到Unix平台,當時,它只是一個很底層的面向報表的存儲引擎。這個工具叫做Unireg。

可是,這個小公司資源有限,Monty天賦極高,面對資源有限的不利條件,他反而更能發揮潛能,總是力圖寫出最高效的代碼。並因此養成了習慣。與Monty同在一起的還有一些別的同事,很少有人能堅持把那些代碼持續寫到20年後,而Monty卻做到了。

1990年,TcX的customer 中開始有人要求要為它的API提供SQL支持,當時,有人想到了直接使用商用資料庫算了,但是Monty覺得商用資料庫的速度難令人滿意。於是,他直接藉助於mSQL的代碼,將它集成到自己的存儲引擎中。但不巧的是,效果並不太好。於是, Monty雄心大起,決心自己重寫一個SQL支持。

1996年,MySQL 1.0發布,只面向一小撥人,相當於內部發布。到了96年10月,MySQL 3.11.1發布了,呵呵,沒有2.x版本。最開始,只提供了Solaris下的二進位版本。一個月後,Linux版本出現了。

緊接下來的兩年里,MySQL依次移植到各個平台下。它發布時,採用的許可策略,有些與眾不同:允許免費商用,但是不能將MySQL與自己的產品綁定在一起發布。如果想一起發布,就必須使用特殊許可,意味著要花銀子。當然,商業支持也是需要花銀子的。其它的,隨用戶怎麼用都可以。這種特殊許可為MySQL帶來了一些收入,從而為它的持續發展打下了良好的基礎。(細想想,PostgreSQL曾經有幾年限入低谷,可能與它的完全免費,不受任何限制有關係)。

MySQL3.22應該是一個標誌性的版本,提供了基本的SQL支持。

MySQL關係型資料庫於1998年1月發行第一個版本。它使用系統核心提供的多線程機制提供完全的多線程運行模式,提供了面向C、C++、Eiffel、Java、Perl、PHP、Python以及Tcl等編程語言的編程介面(APIs),支持多種欄位類型並且提供了完整的操作符支持查詢中的SELECT和WHERE操作。

MySQL是開放源代碼的,因此任何人都可以在General Public License的許可下下載並根據個性化的需要對其進行修改。MySQL因為其速度、可靠性和適應性而備受關注。

1999-2000年,有一家公司在瑞典成立了,叫MySQL AB (AB是瑞典語「股份公司」的意思)。 雇了幾個人,與Sleepycat合作,開發出了 Berkeley DB引擎, 因為BDB支持事務處理,所以,MySQL從此開始支持事務處理了。

2000年4月,MySQL對舊的存儲引擎進行了整理,命名為MyISAM。同時,2001年,Heikiki Tuuri向MySQL提出建議,希望能集成他們的存儲引擎InnoDB,這個引擎同樣支持事務處理,還支持行級鎖。

如今,遺憾的是,BDB和InnoDB好像都被Oracle收購了,為了消滅競爭對手,哪怕是開源的,都是不擇手段。

MySQL與InnoDB的正式結合版本是4.0。

到了MySQL5.0,2003年12月,開始有View,存儲過程之類的東東,當然,其間, bug也挺多。

在2008年1月16號 MySQL被Sun公司收購。

最近,MySQL的創始人Monty Widenius已經向Sun提交了辭呈。head都要走了。

據說,被Sun收購的公司多薄命,不知道MySQL今後前途如何,希望一路走好。相信MySQL的生命力還是很長久的。

時至今日 mysql 和 php 的結合絕對是完美.很多大型的網站也用到mysql資料庫.mysql的發展前景是非常光明的!

MySQL常用命令:

1:使用SHOW語句找出在伺服器上當前存在什麼資料庫:

mysql SHOW DATABASES;

2:2、創建一個資料庫MYSQLDATA

mysql CREATE DATABASE MYSQLDATA;

3:選擇你所創建的資料庫

mysql USE MYSQLDATA; (按回車鍵出現Database changed 時說明操作成功!)

4:查看現在的資料庫中存在什麼表

mysql SHOW TABLES;

5:創建一個資料庫表

mysql CREATE TABLE MYTABLE (name VARCHAR(20), sex CHAR(1));

6:顯示錶的結構:

mysql DESCRIBE MYTABLE;

7:往表中加入記錄

mysql insert into MYTABLE values (」hyq」,」M」);

8:用文本方式將數據裝入資料庫表中(例如D:/mysql.txt)

mysql LOAD DATA LOCAL INFILE 「D:/mysql.txt」 INTO TABLE MYTABLE;

9:導入.sql文件命令(例如D:/mysql.sql)

mysqluse database;

mysqlsource d:/mysql.sql;

10:刪除表

mysqldrop TABLE MYTABLE;

11:清空表

mysqldelete from MYTABLE;

12:更新表中數據

mysqlupdate MYTABLE set sex=」f」 where name=』hyq』;

全局管理許可權對應解釋:

FILE: 在MySQL伺服器上讀寫文件。

PROCESS: 顯示或殺死屬於其它用戶的服務線程。

RELOAD: 重載訪問控制表,刷新日誌等。

SHUTDOWN: 關閉MySQL服務。

資料庫/數據表/數據列許可權:

ALTER: 修改已存在的數據表(例如增加/刪除列)和索引。

CREATE: 建立新的資料庫或數據表。

DELETE: 刪除表的記錄。

DROP: 刪除數據表或資料庫。

INDEX: 建立或刪除索引。

INSERT: 增加表的記錄。

SELECT: 顯示/搜索表的記錄。

UPDATE: 修改表中已存在的記錄。

特別的許可權:

ALL: 允許做任何事(和root一樣)。

USAGE: 只允許登錄–其它什麼也不允許做。

MySQL資料庫導入方法:

MySQL資料庫的導入,有兩種方法:

1) 先導出資料庫SQL腳本,再導入;

2) 直接拷貝資料庫目錄和文件。

在不同操作系統或MySQL版本情況下,直接拷貝文件的方法可能會有不兼容的情況發生。

所以一般推薦用SQL腳本形式導入。下面分別介紹兩種方法。

2. 方法一 SQL腳本形式

操作步驟如下:

2.1. 導出SQL腳本

在原資料庫伺服器上,可以用phpMyAdmin工具,或者mysqldump命令行,導出SQL腳本。

2.1.1 用phpMyAdmin工具

導出選項中,選擇導出「結構」和「數據」,不要添加「DROP DATABASE」和「DROP TABLE」選項。

選中「另存為文件」選項,如果數據比較多,可以選中「gzipped」選項。

將導出的SQL文件保存下來。

2.1.2 用mysqldump命令行

命令格式

mysqldump -u 用戶名 -p 資料庫名 資料庫名.sql

範例:

mysqldump -u root -p abc abc.sql

(導出資料庫abc到abc.sql文件)

提示輸入密碼時,輸入該資料庫用戶名的密碼。

2.2. 創建空的資料庫

通過主控界面/控制面板,創建一個資料庫。假設資料庫名為abc,資料庫全權用戶為abc_f。

2.3. 將SQL腳本導入執行

同樣是兩種方法,一種用phpMyAdmin(mysql資料庫管理)工具,或者mysql命令行。

2.3.1 用phpMyAdmin工具

從控制面板,選擇創建的空資料庫,點「管理」,進入管理工具頁面。

在”SQL”菜單中,瀏覽選擇剛才導出的SQL文件,點擊「執行」以上載並執行。

注意:phpMyAdmin對上載的文件大小有限制,php本身對上載文件大小也有限制,如果原始sql文件

比較大,可以先用gzip對它進行壓縮,對於sql文件這樣的文本文件,可獲得1:5或更高的壓縮率。

gzip使用方法:

# gzip xxxxx.sql

得到

xxxxx.sql.gz文件。

提示輸入密碼時,輸入該資料庫用戶名的密碼。

3 直接拷貝

如果資料庫比較大,可以考慮用直接拷貝的方法,但不同版本和操作系統之間可能不兼容,要慎用。

3.1 準備原始文件

用tar打包為一個文件

3.2 創建空資料庫

3.3 解壓

在臨時目錄中解壓,如:

cd /tmp

tar zxf mydb.tar.gz

3.4 拷貝

將解壓後的資料庫文件拷貝到相關目錄

cd mydb/

cp * /var/lib/mysql/mydb/

對於FreeBSD:

cp * /var/db/mysql/mydb/

3.5 許可權設置

將拷貝過去的文件的屬主改為mysql:mysql,許可權改為660

chown mysql:mysql /var/lib/mysql/mydb/*

chmod 660 /var/lib/mysql/mydb/*

Mssql轉換mysql的方法:

1.導表結構

使用MySQL生成create腳本的方法。找到生成要導出的腳本,按MySQL的語法修改一下到MySQL資料庫中創建該表的列結構什麼的。

2.導表數據

在MSSQL端使用bcp導出文本文件:

bcp 「Select * FROM dbname.dbo.tablename;」 queryout tablename.txt -c -Slocalhost\db2005 -Usa

其中」”中是要導出的sql語句,-c指定使用\t進行欄位分隔,使用\n進行記錄分隔,-S指定資料庫伺服器及實例,-U指定用戶名,-P指定密碼.

在MySQL端使用mysqlimport 導入文本文件到相應表中

mysqlimport -uroot -p databasename /home/test/tablename.txt

其中-u指定用戶名,-p指定密碼,databasename指定資料庫名稱,表名與文件名相同

MySQL備份與恢復:

MySQL備份恢複數據的一般步驟

備份一個資料庫的例子:

1、備份前讀鎖定涉及的表

mysqlLOCK TABLES tbl1 READ,tbl1 READ,…

如果,你在mysqldump實用程序中使用–lock-tables選項則不必使用如上SQL語句。

2、導出資料庫中表的結構和數據

shellmysqldump –opt db_namedb_name.sql

3、啟用新的更新日誌

shellmysqladmin flush-logs

這樣可以記錄你備份後的數據改變為恢複數據準備。

4、解除表的讀鎖

mysqlUNLOCK TABLES;

為了加速上述過程,你可以這樣做:

shell mysqldump –lock-tables –opt db_namedb_name.sql; mysqladmin flush-logs

但是這樣可能會有點小問題。上命令在啟用新的更新日誌前就恢復表的讀鎖,

在更新繁忙的站點,可能有備份後的更新數據沒有記錄在新的日誌中。

現在恢復上面備份的資料庫

1、對涉及的表使用寫鎖

mysqlLOCK TABLES tbl1 WRITE,tbl1 WRITE,…

2、恢復備份的數據

shellmysql db_name db_name.sql

3、恢復更新日誌的內容

shellmysql –one-database db_name hostname.nnn

假設需要使用的日誌名字為hostname.nnn

4、啟用新的更新日誌

shellmysqladmin flush-logs

5、解除表的寫鎖

mysqlUNLOCK TABLES;

希望上面的例子能給你啟發,因為備份數據的手法多種多樣,你所使用的和上面所述可能大不一樣,但是對於備份和恢復中,表的鎖定、啟用新的更新日誌的時機應該是類似的,仔細考慮這個問題。

MySQL資料庫優化:

選擇InnoDB作為存儲引擎

大型產品的資料庫對於可靠性和並發性的要求較高,InnoDB作為默認的MySQL存儲引擎,相對於MyISAM來說是個更佳的選擇。

優化資料庫結構

組織資料庫的schema、表和欄位以降低I/O的開銷,將相關項保存在一起,並提前規劃,以便隨著數據量的增長,性能可以保持較高的水平。

設計數據表應盡量使其佔用的空間最小化,表的主鍵應儘可能短。·對於InnoDB表,主鍵所在的列在每個輔助索引條目中都是可複製的,因此如果有很多輔助索引,那麼一個短的主鍵可以節省大量空間。

僅創建你需要改進查詢性能的索引。索引有助於檢索,但是會增加插入和更新操作的執行時間。

InnoDB的ChangeBuffering特性

InnoDB提供了changebuffering的配置,可減少維護輔助索引所需的磁碟I/O。大規模的資料庫可能會遇到大量的表操作和大量的I/O,以保證輔助索引保持最新。當相關頁面不在緩衝池裡面時,InnoDB的changebuffer將會更改緩存到輔助索引條目,從而避免因不能立即從磁碟讀取頁面而導致耗時的I/O操作。當頁面被載入到緩衝池時,緩衝的更改將被合併,更新的頁面之後會刷新到磁碟。這樣做可提高性能,適用於MySQL5.5及更高版本。

InnoDB頁面壓縮

InnoDB支持對錶進行頁面級的壓縮。當寫入數據頁的時候,會有特定的壓縮演算法對其進行壓縮。壓縮後的數據會寫入磁碟,其打孔機制會釋放頁面末尾的空塊。如果壓縮失敗,數據會按原樣寫入。表和索引都會被壓縮,因為索引通常是資料庫總大小中佔比很大的一部分,壓縮可以顯著節約內存,I/O或處理時間,這樣就達到了提高性能和伸縮性的目的。它還可以減少內存和磁碟之間傳輸的數據量。MySQL5.1及更高版本支持該功能。

注意,頁面壓縮並不能支持共享表空間中的表。共享表空間包括系統表空間、臨時表空間和常規表空間。

使用批量數據導入

在主鍵上使用已排序的數據源進行批量數據的導入可加快數據插入的過程。否則,可能需要在其他行之間插入行以維護排序,這會導致磁碟I/O變高,進而影響性能,增加頁的拆分。關閉自動提交的模式也是有好處的,因為它會為每個插入執行日誌刷新到磁碟。在批量插入期間臨時轉移唯一鍵和外鍵檢查也可顯著降低磁碟I/O。對於新建的表,最好的做法是在批量導入後創建外鍵/唯一鍵約束。

一旦你的數據達到穩定的大小,或者增長的表增加了幾十或幾百兆位元組,就應該考慮使用OPTIMIZETABLE語句重新組織表並壓縮浪費的空間。對重新組織後的表進行全表掃描所需要的I/O會更少。

優化InnoDB磁碟I/O

增加InnoDB緩衝池大小可以讓查詢從緩衝池訪問而不是通過磁碟I/O訪問。通過調整系統變數innodb_flush_method來調整清除緩衝的指標使其達到最佳水平。

MySQL的內存分配

在為MySQL分配足夠的內存之前,請考慮不同領域對MySQL的內存需求。要考慮的關鍵領域是:並發連接——對於大量並發連接,排序和臨時表將需要大量內存。在撰寫本文時,對於處理3000+並發連接的資料庫,16GB到32GB的RAM是足夠的。

內存碎片可以消耗大約10%或更多的內存。像innodb_buffer_pool_size、key_buffer_size、query_cache_size等緩存和緩衝區要消耗大約80%的已分配內存。

日常維護

定期檢查慢的查詢日誌並優化查詢機制以有效使用緩存來減少磁碟I/O。優化它們,以掃描最少的行數,而不是進行全表掃描。

其他可以幫助DBA檢查和分析性能的日誌包括:錯誤日誌、常規查詢日誌、二進位日誌、DDL日誌(元數據日誌)。

定期刷新緩存和緩衝區以降低碎片化。使用OPTIMIZETABLE語句重新組織表並壓縮任何可能被浪費的空間。

原創文章,作者:CR70P,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/130334.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
CR70P的頭像CR70P
上一篇 2024-10-03 23:28
下一篇 2024-10-03 23:28

相關推薦

  • 如何修改mysql的埠號

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

    編程 2025-04-29
  • Python 常用資料庫有哪些?

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

    編程 2025-04-29
  • Python簡單數學計算

    本文將從多個方面介紹Python的簡單數學計算,包括基礎運算符、函數、庫以及實際應用場景。 一、基礎運算符 Python提供了基礎的算術運算符,包括加(+)、減(-)、乘(*)、除…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29
  • openeuler安裝資料庫方案

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

    編程 2025-04-29
  • Python海龜代碼簡單畫圖

    本文將介紹如何使用Python的海龜庫進行簡單畫圖,並提供相關示例代碼。 一、基礎用法 使用Python的海龜庫,我們可以控制一個小海龜在窗口中移動,並利用它的「畫筆」在窗口中繪製…

    編程 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
  • Python櫻花樹代碼簡單

    本文將對Python櫻花樹代碼進行詳細的闡述和講解,幫助讀者更好地理解該代碼的實現方法。 一、簡介 櫻花樹是一種圖形效果,它的實現方法比較簡單。Python中可以通過turtle這…

    編程 2025-04-28

發表回復

登錄後才能評論