當前位置:首頁 » 存儲配置 » shell調用mysql存儲過程

shell調用mysql存儲過程

發布時間: 2024-07-18 17:41:29

『壹』 零基礎如何自學使用Mysql資料庫

對於非計算機出身的我,大學只會hello word和跑馬燈,期間過程確實非常曲折,分享下我的自學過程:

1、 自己在windows和linux上安裝了mysql,自學linux的基礎知識,學習mysql的最基礎的知識,即怎麼寫sql,存儲過程,表的設計等,從0到熟悉大概花了3個月 ,推薦《mysql入門很簡單》。

2、系統地較為深入地學習mysql的sql優化,備份和恢復,參數優化,架構優化,硬體層面的優化,高可用方案,復制技術等等,這段時間你不一定能實際接觸到這些,就像我當初那樣,肯定沒什麼公司招一個小白。 我選擇自己看書,推薦《高性能mysql》,裡面所有的章節都需要看一遍,以現在的水平肯定看不懂,但需要知道大概怎麼回事,為後續的找mysql初級dba的工作打一個鋪墊,這個過程大概也需要3個月。

3、 紙上得來終覺淺,完成以上兩步,我開始准備找一份mysql相關的工作,而不是天天用著excel表格做著select * from table_sb這樣的工作。 當然我這么猥瑣的人肯定不會裸辭,該畫的電路板也一樣畫,業余時間開始投初級mysql dba的工作,並且不間斷地學習,網上各種找mysql面試的相關題目(實際上我當時完全沒有任何實戰經驗),陸續收到一些面試,憑借之前自學的mysql知識,開始胡亂吹牛逼,先混進去再說。 你不做mysql實際相關的工作,永遠也不知道自己之前認知的db知識有多幼稚。 友情提示一點,一般公司都沒有專職dba的,所以面試的時候一定要自信,其實你學了這么多,雖然毫無實戰經驗,理論知識很大概率比面試你的人牛逼,所以各種吹,我就這樣真正進入初級dba的圈子(由於這時對linux還處於cd ls的水平,所以之前也根本沒做過運維),這個邊工作邊找工作的過程又持續了2個月。

4、真正進入互聯網,接觸生產環境後,這是我進步最大的時候。 第一步需要將之前所學真正地應用起來,並且應用的過程中,再回頭看之前的書籍,這時候需要真正去理解,而不是似是而非,一知半解。 這時再推薦《高性能mysql 第三版》,全本再看一遍,這時需要全部看懂,另外還有《mysql技術內幕:innodb存儲引擎》等等。 總之這段時間就需要開始關注mysql一些細節了,比如db故障處理,高可用,負載均衡等等的具體實現了。 另外,linux的知識同步也要深入去學習,至少會寫shell腳本,常見的linux知識等,我在這花了1年多;

5、 dba的工作一般是非常輕閑的,畢竟不是大公司,技術能力有限,該學的也學得差不多了,接觸不到海量數據,高並發等比較鍛煉人的場合,於是我又准備跳了。 於是來了公有雲,現在每天運維萬多個db實例,平均每天處理5+個緊急db故障,幾乎mysql會遇到的問題,感覺都遇到了,能感覺到技術實力和經驗也在每天都在積累,在進步。 但是感覺還是欠缺了很多,下一步就看你選擇了,是再去研究源代碼,底層原理的東西多點,還是資料庫運維和應用多一點,就比如業界姜承堯,何登成與葉金榮的區別。 由於我的歷史原因,對c++等幾乎不懂,平時也用不到,所以看代碼等事實際太累,於是我再去學mongodb,接了公司mongodb運維的活,算是在廣度上的一個擴展,萬一哪天mysql不行了呢

6、 總之,對於db小白來說,最重要的一點就是,學習的過程不能斷。 PS 上面的方法比較野路子,適合沒什麼基礎的童鞋,如果本來就是DBA,比如從oracle轉到mysql,那麼建議直接看mysql官方文檔,而官方文檔是db達到一定水平後必看,出問題時必查的權威文檔。

『貳』 xshell怎麼導出Mysql存儲過程

首先,導出存儲過程的命令如下,
mysqlmp -R -ndt dbname -u root -p > xxx.sql
另外,補充其他知識點,
查詢資料庫中的存儲過程
select * from mysql.proc where db = dbName and `type` = 'PROCEDURE'
show procere status;
查看存儲過程或函數的創建代碼
show create procere proc_name;
show create function func_name;

『叄』 什麼是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)

    mysql>use database;

    mysql>source d:/mysql.sql;

    10:刪除表

    mysql>drop TABLE MYTABLE;

    11:清空表

    mysql>delete from MYTABLE;

    12:更新表中數據

    mysql>update 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工具,或者mysqlmp命令行,導出SQL腳本。

    2.1.1 用phpMyAdmin工具

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

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

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

    2.1.2 用mysqlmp命令行

    命令格式

    mysqlmp -u 用戶名 -p 資料庫名 > 資料庫名.sql

    範例:

    mysqlmp -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 -Slocalhostdb2005 -Usa

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

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

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

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

    MySQL備份與恢復:

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

    備份一個資料庫的例子:

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

    mysql>LOCK TABLES tbl1 READ,tbl1 READ,…
    如果,你在mysqlmp實用程序中使用--lock-tables選項則不必使用如上SQL語句。

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

    shell>mysqlmp --opt db_name>db_name.sql

    3、啟用新的更新日誌

    shell>mysqladmin flush-logs

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

    4、解除表的讀鎖

    mysql>UNLOCK TABLES;

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

    shell> mysqlmp --lock-tables --opt db_name>db_name.sql; mysqladmin flush-logs

    但是這樣可能會有點小問題。上命令在啟用新的更新日誌前就恢復表的讀鎖,
    在更新繁忙的站點,可能有備份後的更新數據沒有記錄在新的日誌中。
    現在恢復上面備份的資料庫

    1、對涉及的表使用寫鎖

    mysql>LOCK TABLES tbl1 WRITE,tbl1 WRITE,…

    2、恢復備份的數據

    shell>mysql db_name < db_name.sql

    3、恢復更新日誌的內容

    shell>mysql --one-database db_name < hostname.nnn

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

    4、啟用新的更新日誌

    shell>mysqladmin flush-logs

    5、解除表的寫鎖

    mysql>UNLOCK 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語句重新組織表並壓縮任何可能被浪費的空間。

『肆』 如何將數據從Oracle資料庫實時復制到MYSQL

OGG全稱為Oracle GoldenGate,是由Oracle官方提供的用於解決異構數據環境中數據復制的一個商業工具。相比於其它遷移工具OGG的優勢在於可以直接解析源端Oracle的redo log,因此能夠實現在不需要對原表結構做太多調整的前提下完成數據增量部分的遷移。本篇文章將重點介紹如何使用OGG實現Oracle到MySQL數據的平滑遷移,以及講述個人在遷移過程中所碰到問題的解決方案。


(一)OGG邏輯架構

參照上圖簡單給大家介紹下OGG邏輯架構,讓大家對OGG數據同步過程有個簡單了解,後面章節會詳細演示相關進程的配置方式,在OGG使用過程中主要涉及以下進程及文件:

  • Manager進程:需要源端跟目標端同時運行,主要作用是監控管理其它進程,報告錯誤,分配及清理數據存儲空間,發布閾值報告等

  • Extract進程:運行在資料庫源端,主要用於捕獲數據的變化,負責全量、增量數據的抽取

  • Trails文件:臨時存放在磁碟上的數據文件

  • Data Pump進程:運行在資料庫源端,屬於Extract進程的一個輔助進程,如果不配置Data Pump,Extract進程會將抽取的數據直接發送到目標端的Trail文件,如果配置了Data Pump,Extract進程會將數據抽取到本地Trail文件,然後通過Data Pump進程發送到目標端,配置Data Pump進程的主要好處是即使源端到目標端發生網路中斷,Extract進程依然不會終止

  • Collector進程:接收源端傳輸過來的數據變化,並寫入本地Trail文件中

  • Replicat進程:讀取Trail文件中記錄的數據變化,創建對應的DML語句並在目標端回放

  • 二、遷移方案

    (一)環境信息

    OGG版本 OGG 12.2.0.2.2 For Oracle OGG 12.2.0.2.2 For MySQL

    資料庫版本 Oracle 11.2.0.4 MySQL 5.7.21

    OGG_HOME /home/oracle/ogg /opt/ogg

    (二)表結構遷移

    表結構遷移屬於難度不高但內容比較繁瑣的一步,我們在遷移表結構時使用了一個叫sqlines的開源工具,對於sqlines工具在MySQL端創建失敗及不符合預期的表結構再進行特殊處理,以此來提高表結構轉換的效率。

    注意:OGG在Oracle遷移MySQL的場景下不支持DDL語句同步,因此表結構遷移完成後到資料庫切換前盡量不要再修改表結構。

    (三)數據遷移

    數據同步的操作均採用OGG工具進行,考慮數據全量和增量的銜接,OGG需要先將增量同步的抽取進程啟動,抓取資料庫的redo log,待全量抽取結束後開啟增量數據回放,應用全量和增量這段期間產生的日誌數據,OGG可基於參數配置進行重復數據處理,所以使用OGG時優先將增量進行配置並啟用。此外,為了避免本章節篇幅過長,OGG參數將不再解釋,有需要的朋友可以查看官方提供的Reference文檔查詢任何你不理解的參數。

    1.源端OGG配置

    (1)Oracle資料庫配置

    針對Oracle資料庫,OGG需要資料庫開啟歸檔模式及增加輔助補充日誌、強制記錄日誌等來保障OGG可抓取到完整的日誌信息

    查看當前環境是否滿足要求,輸出結果如下圖所示:

    (2)Oracle資料庫OGG用戶創建

    OGG需要有一個用戶有許可權對資料庫的相關對象做操作,以下為涉及的許可權,該示例將創建一個用戶名和密碼均為ogg的Oracle資料庫用戶並授予以下許可權

    (3)源端OGG 管理進程(MGR)配置

    (4)源端OGG 表級補全日誌(trandata)配置

    表級補全日誌需要在最小補全日誌打開的情況下才起作用,之前只在資料庫級開啟了最小補全日誌(alter database add supplemental log data;),redolog記錄的信息還不夠全面,必須再使用add trandata開啟表級的補全日誌以獲得必要的信息。

    (5)源端OGG 抽取進程(extract)配置

    Extract進程運行在資料庫源端,負責從源端數據表或日誌中捕獲數據。Extract進程利用其內在的checkpoint機制,周期性地檢查並記錄其讀寫的位置,通常是寫入到本地的trail文件。這種機制是為了保證如果Extract進程終止或者操作系統宕機,我們重啟Extract進程後,GoldenGate能夠恢復到以前的狀態,從上一個斷點處繼續往下運行,而不會有任何數據損失。

    (6)源端OGG 傳輸進程(pump)配置

    pump進程運行在資料庫源端,其作用非常簡單。如果源端的Extract抽取進程使用了本地trail文件,那麼pump進程就會把trail文件以數據塊的形式通過TCP/IP協議發送到目標端,Pump進程本質上是Extract進程的一種特殊形式,如果不使用trail文件,那麼Extract進程在抽取完數據後,直接投遞到目標端。

    補充:pump進程啟動時需要與目標端的mgr進程進行連接,所以需要優先將目標端的mgr提前配置好,否則會報錯連接被拒絕,無法傳輸抽取的日誌文件到目標端對應目錄下

    (7)源端OGG 異構mapping文件(defgen)生成

    該文件記錄了源庫需要復制的表的表結構定義信息,在源庫生成該文件後需要拷貝到目標庫的dirdef目錄,當目標庫的replica進程將傳輸過來的數據apply到目標庫時需要讀寫該文件,同構的資料庫不需要進行該操作。

    2.目標端OGG配置

    (1)目標端MySQL資料庫配置

  • 確認MySQL端表結構已經存在

  • MySQL資料庫OGG用戶創建

  • mysql> create user 'ogg'@'%' identified by 'ogg';

  • mysql> grant all on *.* to 'ogg'@'%';

  • #### 提前創建好ogg存放checkpoint表的資料庫

  • mysql> create database ogg;

  • (2)目標端OGG 管理進程(MGR)配置

    目標端的MGR進程和源端配置一樣,可直接將源端配置方式在目標端重復執行一次即可,該部分不在贅述

    (3)目標端OGG 檢查點日誌表(checkpoint)配置

    checkpoint表用來保障一個事務執行完成後,在MySQL資料庫從有一張表記錄當前的日誌回放點,與MySQL復制記錄binlog的GTID或position點類似。

    #### 切換至ogg軟體目錄並執行ggsci進入命令行終端

  • shell> cd $OGG_HOME

  • shell> ggsci

  • ggsci> edit param ./GLOBALS

  • checkpointtable ogg.ggs_checkpoint

  • ggsci> dblogin sourcedb [email protected]:3306 userid ogg

  • ggsci> add checkpointtable ogg.ggs_checkpoint

  • (4)目標端OGG 回放線程(replicat)配置

    Replicat進程運行在目標端,是數據投遞的最後一站,負責讀取目標端Trail文件中的內容,並將解析其解析為DML語句,然後應用到目標資料庫中。

  • #### 切換至ogg軟體目錄並執行ggsci進入命令行終端

  • shell> cd $OGG_HOME

  • shell> ggsci

  • #### 添加一個回放線程並與源端pump進程傳輸過來的trail文件關聯,並使用checkpoint表確保數據不丟失

  • ggsci> add replicat r_cms,exttrail /opt/ogg/dirdat/ms,checkpointtable ogg.ggs_checkpoint

  • #### 增加/編輯回放進程配置文件

  • ggsci> edit params r_cms

  • replicat r_cms

  • targetdb [email protected]:3306,userid ogg,password ogg

  • sourcedefs /opt/ogg/dirdef/cms.def

  • discardfile /opt/ogg/dirrpt/r_cms.dsc,append,megabytes 1024

  • HANDLECOLLISIONS

  • MAP cms.*,target cms.*;

  • 注意:replicat進程只需配置完成,無需啟動,待全量抽取完成後再啟動。

    至此源端環境配置完成

    待全量數據抽取完畢後啟動目標端回放進程即可完成數據准實時同步。

    3.全量同步配置

    全量數據同步為一次性操作,當OGG軟體部署完成及增量抽取進程配置並啟動後,可配置1個特殊的extract進程從表中抽取數據,將抽取的數據保存到目標端生成文件,目標端同時啟動一個單次運行的replicat回放進程將數據解析並回放至目標資料庫中。

    (1)源端OGG 全量抽取進程(extract)配置

  • #### 切換至ogg軟體目錄並執行ggsci進入命令行終端

  • shell> cd $OGG_HOME

  • shell> ggsci

  • #### 增加/編輯全量抽取進程配置文件

  • #### 其中RMTFILE指定抽取的數據直接傳送到遠端對應目錄下

  • #### 注意:RMTFILE參數指定的文件只支持2位字元,如果超過replicat則無法識別

  • ggsci> edit params ei_cms

  • SOURCEISTABLE

  • SETENV (NLS_LANG = "AMERICAN_AMERICA.AL32UTF8")

  • SETENV (ORACLE_SID=cms)

  • SETENV (ORACLE_HOME=/data/oracle/11.2/db_1)

  • USERID ogg@appdb,PASSWORD ogg

  • RMTHOST 17X.1X.84.121,MGRPORT 7809

  • RMTFILE /opt/ogg/dirdat/ms,maxfiles 100,megabytes 1024,purge

  • TABLE cms.*;

  • #### 啟動並查看抽取進程正常

  • shell> nohup ./extract paramfile ./dirprm/ei_cms.prm reportfile ./dirrpt/ei_cms.rpt &

  • ## 查看日誌是否正常進行全量抽取

  • shell> tail -f ./dirrpt/ei_cms.rpt

  • (2)目標端OGG 全量回放進程(replicat)配置

  • #### 切換至ogg軟體目錄並執行ggsci進入命令行終端

  • shell> cd $OGG_HOME

  • shell> ggsci

  • ggsci> edit params ri_cms

  • SPECIALRUN

  • END RUNTIME

  • TARGETDB [email protected]:3306,USERID ogg,PASSWORD ogg

  • EXTFILE /opt/ogg/dirdat/ms

  • DISCARDFILE ./dirrpt/ri_cms.dsc,purge

  • MAP cms.*,TARGET cms.*;

  • #### 啟動並查看回放進程正常

  • shell> nohup ./replicat paramfile ./dirprm/ri_cms.prm reportfile ./dirrpt/ri_cms.rpt &

  • #### 查看日誌是否正常進行全量回放

  • shell> tail -f ./dirrpt/ri_cms.rpt

  • 三、數據校驗

    數據校驗是數據遷移過程中必不可少的環節,本章節提供給幾個數據校驗的思路共大家參數,校驗方式可以由以下幾個角度去實現:

    1.通過OGG日誌查看全量、增量過程中discards記錄是否為0來判斷是否丟失數據;

    2.通過對源端、目標端的表執行count判斷數據量是否一致;

    3.編寫類似於pt-table-checksum校驗原理的程序,實現行級別一致性校驗,這種方式優缺點特別明顯,優點是能夠完全准確對數據內容進行校驗,缺點是需要遍歷每一行數據,校驗成本較高;

    4.相對折中的數據校驗方式是通過業務角度,提前編寫好數十個返回結果較快的SQL,從業務角度抽樣校驗。

    四、遷移問題處理

    本章節將講述遷移過程中碰到的一些問題及相應的解決方式。

    (一)MySQL限制

    在Oracle到MySQL的表結構遷移過程中主要碰到以下兩個限制:

    1. Oracle端的表結構因為最初設計不嚴謹,存在大量的列使用varchar(4000)數據類型,導致遷移到MySQL後超出行限制,表結構無法創建。由於MySQL本身數據結構的限制,一個16K的數據頁最少要存儲兩行數據,因此單行數據不能超過65,535 bytes,因此針對這種情況有兩種解決方式:

  • 根據實際存儲數據的長度,對超長的varchar列進行收縮;

  • 對於無法收縮的列轉換數據類型為text,但這在使用過程中可能導致一些性能問題;

  • 2. 與第一點類似,在Innodb存儲引擎中,索引前綴長度限制是767 bytes,若使用DYNAMIC、COMPRESSED行格式且開啟innodblargeprefix的場景下,這個限制是3072 bytes,即使用utf8mb4字元集時,最多隻能對varchar(768)的列創建索引;

    3. 使用ogg全量初始化同步時,若存在外鍵約束,批量導入時由於各表的插入順序不唯一,可能子表先插入數據而主表還未插入,導致報錯子表依賴的記錄不存在,因此建議數據遷移階段禁用主外鍵約束,待遷移結束後再打開。

  • mysql>set global foreign_key_checks=off;


  • (二)全量與增量銜接

    HANDLECOLLISIONS參數是實現OGG全量數據與增量數據銜接的關鍵,其實現原理是在全量抽取前先開啟增量抽取進程,抓去全量應用期間產生的redo log,當全量應用完成後,開啟增量回放進程,應用全量期間的增量數據。使用該參數後增量回放DML語句時主要有以下場景及處理邏輯:

  • 目標端不存在delete語句的記錄,忽略該問題並不記錄到discardfile

  • 目標端丟失update記錄

    - 更新的是主鍵值,update轉換成insert

    - 更新的鍵值是非主鍵,忽略該問題並不記錄到discardfile

  • 目標端重復insert已存在的主鍵值,這將被replicat進程轉換為UPDATE現有主鍵值的行

  • (三)OGG版本選擇

    在OGG版本選擇上我們也根據用戶的場景多次更換了OGG版本,最初因為客戶的Oracle 資料庫版本為11.2.0.4,因此我們在選擇OGG版本時優先選擇使用了11版本,但是使用過程中發現,每次數據抽取生成的trail文件達到2G左右時,OGG報錯連接中斷,查看RMTFILE參數詳細說明了解到trail文件默認限制為2G,後來我們替換OGG版本為12.3,使用MAXFILES參數控制生成多個指定大小的trail文件,回放時Replicat進程也能自動輪轉讀取Trail文件,最終解決該問題。但是如果不幸Oracle環境使用了Linux 5版本的系統,那麼你的OGG需要再降一個小版本,最高只能使用OGG 12.2。

    (四)無主鍵表處理

    在遷移過程中還碰到一個比較難搞的問題就是當前Oracle端存在大量表沒有主鍵。在MySQL中的表沒有主鍵這幾乎是不被允許的,因為很容易導致性能問題和主從延遲。同時在OGG遷移過程中表沒有主鍵也會產生一些隱患,比如對於沒有主鍵的表,OGG默認是將這個一行數據中所有的列拼湊起來作為唯一鍵,但實際還是可能存在重復數據導致數據同步異常,Oracle官方對此也提供了一個解決方案,通過對無主鍵表添加GUID列來作為行唯一標示,具體操作方式可以搜索MOS文檔ID 1271578.1進行查看。

    (五)OGG安全規則

  • 報錯信息

  • 2019-03-08 06:15:22 ERROR OGG-01201 Error reported by MGR : Access denied.


  • 錯誤信息含義源端報錯表示為該抽取進程需要和目標端的mgr進程通訊,但是被拒絕,具體操作為:源端的extract進程需要與目標端mgr進行溝通,遠程將目標的replicat進行啟動,由於安全性現在而被拒絕連接。

  • 報錯原因

  • 在Oracle OGG 11版本後,增加了新特性安全性要求,如果需要遠程啟動目標端的replicat進程,需要在mgr節點增加訪問控制參數允許遠程調用

  • 解決辦法

  • 在源端和目標端的mgr節點上分別增加訪問控制規則並重啟

  • ## 表示該mgr節點允許(ALLOW)10.186網段(IPADDR)的所有類型程序(PROG *)進行連接訪問ACCESSRULE, PROG *, IPADDR 10.186.*.*, ALLOW


  • (六)數據抽取方式

  • 報錯信息

  • 2019-03-15 14:49:04 ERROR OGG-01192 Trying to use RMTTASK on data types which may be written as LOB chunks (Table: 'UNIONPAYCMS.CMS_OT_CONTENT_RTF').


  • 報錯原因

  • 根據官方文檔說明,當前直接通過Oracle資料庫抽取數據寫到MySQL這種initial-load方式,不支持LOBs數據類型,而表 UNIONPAYCMS.CMSOTCONTENT_RTF 則包含了CLOB欄位,無法進行傳輸,並且該方式不支持超過4k的欄位數據類型

  • 解決方法

  • 將抽取進程中的RMTTASK改為RMTFILE參數 官方建議將數據先抽取成文件,再基於文件數據解析進行初始化導入

『伍』 shell中怎麼獲取存儲過程的輸出參數給變數

#下面的代碼是對於從oracle的sqlplus返回變數值給shell的例子
output=`sqlplus -s unitele/lemontea << EOF
set heading off feedback off verify off
drop function test_get_param_value_p;
CREATE OR REPLACE function test_get_param_value_p
(
is_citycode in varchar2
)
return varchar2
is
on_value varchar2(100);
begin
on_value :='100000';
dbms_output.put_line(on_value);
dbms_output.put_line(is_citycode);
return on_value;
end;
/
select test_get_param_value_p('501') from al;
exit
EOF
`
echo "Oracle的輸出變數值:"$output
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
存儲過程 myproc(in_num in number,out_num out number)
sql腳本模板
先編輯一個mysql.sql文件,內容如下:
------------
var nret number;
execute :nret := 0;--初始化
call myproc(in_code,:nret)--執行存儲過程,in_code會被替換掉
/
select 'retcode[' || :nret || ']retcode' from al--顯示結果
/
quit;
-------------
SHELL腳本mysh.sh,內容如下
-------------
#./mysh.sh 123
cd /home/myshell
sed "s/in_code/$1/" mysql.sql > mysql01.sql
#根據sql腳本模板生成實際腳本
sqlplus usr/pwd@db result$1.txt
#執行sql腳本並把結果輸入result$1.txt
echo ok!
-------------
在LINUX下執行./mysh.sh 123,生成result123.txt,myproc輸出參數在'retcode['和']retcode'之間。

『陸』 幾個常用的MySQL性能測試工具

1、mysqlslap
安裝:簡單,裝了mysql就有了

作用:模擬並發測試資料庫性能。

優點:簡單,容易使用。

不足:不能指定生成的數據規模,測試過程不清楚針對十萬級還是百萬級數據做的測試,感覺不太適合做綜合測試,比較適合針對既有資料庫,對單個sql進行優化的測試。

使用方法:
可以使用mysqlslap --help來顯示使用方法:

Default options are read from the following files in the given order:
/etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf

--concurrency代表並發數量,多個可以用逗號隔開,concurrency=10,50,100, 並發連接線程數分別是10、50、100個並發。

--engines代表要測試的引擎,可以有多個,用分隔符隔開。
--iterations代表要運行這些測試多少次。
--auto-generate-sql 代表用系統自己生成的SQL腳本來測試。
--auto-generate-sql-load-type 代表要測試的是讀還是寫還是兩者混合的(read,write,update,mixed)
--number-of-queries 代表總共要運行多少次查詢。每個客戶運行的查詢數量可以用查詢總數/並發數來計算。
--debug-info 代表要額外輸出CPU以及內存的相關信息。
--number-int-cols :創建測試表的 int 型欄位數量
--auto-generate-sql-add-autoincrement : 代表對生成的表自動添加auto_increment列,從5.1.18版本開始
--number-char-cols 創建測試表的 char 型欄位數量。
--create-schema 測試的schema,MySQL中schema也就是database。
--query 使用自定義腳本執行測試,例如可以調用自定義的一個存儲過程或者sql語句來執行測試。
--only-print 如果只想列印看看SQL語句是什麼,可以用這個選項。

mysqlslap -umysql -p123 --concurrency=100 --iterations=1 --auto-generate-sql --auto-generate-sql-add-autoincrement --auto-generate-sql-load-type=mixed --engine=myisam --number-of-queries=10 --debug-info

或:

指定資料庫和sql語句:

mysqlslap -h192.168.3.18 -P4040 --concurrency=100 --iterations=1 --create-schema='test' --query='select * from test;' --number-of-queries=10 --debug-info -umysql -p123

要是看到底做了什麼可以加上:--only-print

Benchmark
Average number of seconds to run all queries: 25.225 seconds
Minimum number of seconds to run all queries: 25.225 seconds
Maximum number of seconds to run all queries: 25.225 seconds
Number of clients running queries: 100
Average number of queries per client: 0

以上表明100個客戶端同時運行要25秒

2、sysbench
安裝:
可以從http://sourceforge.net/projects/sysbench/ 下載
tar zxf sysbench-0.4.12.tar.gz
cd sysbench-0.4.12
./autogen.sh
./configure && make && make install
strip /usr/local/bin/sysbench

安裝時候可能會報錯,後來發現個好文 http://blog.csdn.net/icelemon1314/article/details/7004955 怕以後找不到,也貼過來吧

1.如果mysql不是默認路徑安裝,那麼需要通過指定--with-mysql-includes和--with-mysql-libs參數來載入mysql安裝路徑
2.如果報錯:
../libtool: line 838: X--tag=CC: command not found
../libtool: line 871: libtool: ignoring unknown tag : command not found
../libtool: line 838: X--mode=link: command not found
../libtool: line 1004: *** Warning: inferring the mode of operation is deprecated.: command not found
../libtool: line 1005: *** Future versions of Libtool will require --mode=MODE be specified.: command not found
../libtool: line 2231: X-g: command not found
../libtool: line 2231: X-O2: command not found
那麼執行下根目錄的:autogen.sh文件,然後重新configure && make && make install
3.如果報錯:
sysbench: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory
那麼執行下:
n -s /usr/local/mysql5.5/mysql/lib/libmysqlclient.so.18 /usr/lib64/
4.如果執行autogen.sh時,報如下錯誤:
./autogen.sh: line 3: aclocal: command not found
那麼需要安裝一個軟體:
yum install automake
然後需要增加一個參數:查找: AC_PROG_LIBTOOL 將其注釋,然後增加AC_PROG_RANLIB

作用:模擬並發,可以執行CPU/內存/線程/IO/資料庫等方面的性能測試。資料庫目前支持MySQL/Oracle/PostgreSQL

優點:可以指定測試數據的規模,可以單獨測試讀、寫的性能,也可以測試讀寫混合的性能。

不足:測試的時候,由於網路原因,測試的非常慢,但是最終給的結果卻很好,並發支持很高,所以給我的感覺是並不太准確。當然也可能我沒搞明白原理

使用方法:

准備數據
sysbench --test=oltp --mysql-table-engine=myisam --oltp-table-size=400000 --mysql-db=dbtest2 --mysql-user=root --mysql-host=192.168.1.101 --mysql-password=pwd prepare
執行測試
sysbench --num-threads=100 --max-requests=4000 --test=oltp --mysql-table-engine=innodb --oltp-table-size=400000 --mysql-db=dbtest1 --mysql-user=root --mysql-host=192.168.1.101 --mysql-password=pwd run

sysbench 0.4.12: multi-threaded system evaluation benchmark

No DB drivers specified, using mysql
Running the test with following options:
Number of threads: 100

Doing OLTP test.
Running mixed OLTP test
Using Special distribution (12 iterations, 1 pct of values are returned in 75 pct cases)
Using "BEGIN" for starting transactions
Using auto_inc on the id column
Maximum number of requests for OLTP test is limited to 4000
Threads started!
Done.

OLTP test statistics:
queries performed:
read: 56014
write: 20005
other: 8002
total: 84021
transactions: 4001 (259.14 per sec.)
deadlocks: 0 (0.00 per sec.)
read/write requests: 76019 (4923.75 per sec.)
other operations: 8002 (518.29 per sec.)

Test execution summary:
total time: 15.4393s
total number of events: 4001
total time taken by event execution: 1504.7744
per-request statistics:
min: 33.45ms
avg: 376.10ms
max: 861.53ms
approx. 95 percentile: 505.65ms

Threads fairness:
events (avg/stddev): 40.0100/0.67
execution time (avg/stddev): 15.0477/0.22

3、tpcc-mysql
安裝:
如果從原網站上下載源碼比較麻煩,需要工具、注冊、生成證書等。這里提供一個下載包http://blog.chinaunix.net/blog/downLoad/fileid/8532.html
export C_INCLUDE_PATH=/usr/include/mysql
export PATH=/usr/bin:$PATH
export LD_LIBRARY_PATH=/usr/lib/mysql
cd /tmp/tpcc/src
make
然後就會在 /tmp/tpcc-mysql 下生成 tpcc 命令行工具 tpcc_load 、 tpcc_start

作用:測試mysql資料庫的整體性能

優點:符合tpcc標准,有標準的方法,模擬真實的交易活動,結果比較可靠。

不足:不能單獨測試讀或者寫的性能,對於一些以查詢為主或者只寫的應用,就沒有這么大的意義了。

使用方法:

載入數據
創建庫
mysql>create database tpcc10;
創建表:
shell>mysql tpcc10 < create_table.sql
添加外鍵:
shell>mysql tpcc10 < add_fkey_idx.sql

載入數據:
1、單進程載入:
shell>./tpcc_load 192.168.11.172 tpcc10 root pwd 300
|主機||資料庫||用戶||密碼||warehouse|
2、並發載入:(推薦,但需要修改一下)
shell>./load.sh tpcc300 300
|資料庫||warehouse|
3、測試
./tpcc_start -h192.168.11.172 -d tpcc -u root -p 'pwd' -w 10 -c 10 -r 10 -l 60 -i 10 -f /mnt/hgfs/mysql/tpcc100_2013522.txt
***************************************
*** ###easy### TPC-C Load Generator ***
***************************************
option h with value '192.168.11.172'
option d with value 'tpcc'
option u with value 'root'
option p with value 'pwd'
option w with value '1'
option c with value '100'
option r with value '120'
option l with value '60'
option i with value '10'
option f with value '/mnt/hgfs/mysql/tpcc100_2013522.txt'
<Parameters>
[server]: 192.168.11.172
[port]: 3306
[DBname]: tpcc
[user]: root
[pass]: pwd
[warehouse]: 1
[connection]: 100
[rampup]: 120 (sec.)
[measure]: 60 (sec.)

RAMP-UP TIME.(120 sec.)

MEASURING START.

『柒』 mysql 如何備份和還原資料庫

目前 MySQL 支持的免費備份工具有:mysqlmp、mysqlhot,還可以用 SQL 語法進行備份:BACKUP TABLE 或者 SELECT INTO OUTFILE,又或者備份二進制日誌(binlog),還可以是直接拷貝數據文件和相關的配置文件。MyISAM 表是保存成文件的形式,因此相對比較容易備份,上面提到的幾種方法都可以使用。Innodb 所有的表都保存在同一個數據文件 ibdata1 中(也可能是多個文件,或者是獨立的表空間文件),相對來說比較不好備份,免費的方案可以是拷貝數據文件、備份 binlog,或者用 mysqlmp。

1、mysqlmp
1.1 備份
mysqlmp 是採用SQL級別的備份機制,它將數據表導成 SQL 腳本文件,在不同的 MySQL 版本之間升級時相對比較合適,這也是最常用的備份方法。現在來講一下 mysqlmp 的一些主要參數:

•--compatible=name
它告訴 mysqlmp,導出的數據將和哪種資料庫或哪個舊版本的 MySQL 伺服器相兼容。值可以為 ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options 等,要使用幾個值,用逗號將它們隔開。當然了,它並不保證能完全兼容,而是盡量兼容。

•--complete-insert,-c
導出的數據採用包含欄位名的完整 INSERT 方式,也就是把所有的值都寫在一行。這么做能提高插入效率,但是可能會受到 max_allowed_packet 參數的影響而導致插入失敗。因此,需要謹慎使用該參數,至少我不推薦。

•--default-character-set=charset
指定導出數據時採用何種字元集,如果數據表不是採用默認的 latin1 字元集的話,那麼導出時必須指定該選項,否則再次導入數據後將產生亂碼問題。

•--disable-keys
告訴 mysqlmp 在 INSERT 語句的開頭和結尾增加 /*!40000 ALTER TABLE table DISABLE KEYS */; 和 /*!40000 ALTER TABLE table ENABLE KEYS */; 語句,這能大大提高插入語句的速度,因為它是在插入完所有數據後才重建索引的。該選項只適合 MyISAM 表。

•--extended-insert = true|false
默認情況下,mysqlmp 開啟 --complete-insert 模式,因此不想用它的的話,就使用本選項,設定它的值為 false 即可。

•--hex-blob
使用十六進制格式導出二進制字元串欄位。如果有二進制數據就必須使用本選項。影響到的欄位類型有 BINARY、VARBINARY、BLOB。

•--lock-all-tables,-x
在開始導出之前,提交請求鎖定所有資料庫中的所有表,以保證數據的一致性。這是一個全局讀鎖,並且自動關閉 --single-transaction 和 --lock-tables 選項。

•--lock-tables
它和 --lock-all-tables 類似,不過是鎖定當前導出的數據表,而不是一下子鎖定全部庫下的表。本選項只適用於 MyISAM 表,如果是 Innodb 表可以用 --single-transaction 選項。

•--no-create-info,-t
只導出數據,而不添加 CREATE TABLE 語句。

•--no-data,-d
不導出任何數據,只導出資料庫表結構。

•--opt
這只是一個快捷選項,等同於同時添加 --add-drop-tables --add-locking --create-option --disable-keys --extended-insert --lock-tables --quick --set-charset 選項。本選項能讓 mysqlmp 很快的導出數據,並且導出的數據能很快導回。該選項默認開啟,但可以用 --skip-opt 禁用。注意,如果運行 mysqlmp 沒有指定 --quick 或 --opt 選項,則會將整個結果集放在內存中。如果導出大資料庫的話可能會出現問題。

•--quick,-q
該選項在導出大表時很有用,它強制 mysqlmp 從伺服器查詢取得記錄直接輸出而不是取得所有記錄後將它們緩存到內存中。

•--routines,-R
導出存儲過程以及自定義函數。

•--single-transaction
該選項在導出數據之前提交一個 BEGIN SQL語句,BEGIN 不會阻塞任何應用程序且能保證導出時資料庫的一致性狀態。它只適用於事務表,例如 InnoDB 和 BDB。本選項和 --lock-tables 選項是互斥的,因為 LOCK TABLES 會使任何掛起的事務隱含提交。要想導出大表的話,應結合使用 --quick 選項。

•--triggers
同時導出觸發器。該選項默認啟用,用 --skip-triggers 禁用它。

其他參數詳情請參考手冊,我通常使用以下 SQL 來備份 MyISAM 表:

/usr/local/mysql/bin/mysqlmp -uyejr -pyejr --default-character-set=utf8 --opt --extended-insert=false \
--triggers -R --hex-blob -x db_name > db_name.sql
使用以下 SQL 來備份 Innodb 表:

/usr/local/mysql/bin/mysqlmp -uyejr -pyejr --default-character-set=utf8 --opt --extended-insert=false \
--triggers -R --hex-blob --single-transaction db_name > db_name.sql

1.2 還原
用 mysqlmp 備份出來的文件是一個可以直接倒入的 SQL 腳本,有兩種方法可以將數據導入。

•直接用 mysql 客戶端
例如:

/usr/local/mysql/bin/mysql -uyejr -pyejr db_name < db_name.sql

•用 SOURCE 語法
其實這不是標準的 SQL 語法,而是 mysql 客戶端提供的功能,例如:

SOURCE /tmp/db_name.sql;
這里需要指定文件的絕對路徑,並且必須是 mysqld 運行用戶(例如 nobody)有許可權讀取的文件。

2、 mysqlhot
2.1 備份
mysqlhot 是一個 PERL 程序,最初由Tim Bunce編寫。它使用 LOCK TABLES、FLUSH TABLES 和 cp 或 scp 來快速備份資料庫。它是備份資料庫或單個表的最快的途徑,但它只能運行在資料庫文件(包括數據表定義文件、數據文件、索引文件)所在的機器上。mysqlhot 只能用於備份 MyISAM,並且只能運行在 類Unix 和 NetWare 系統上。

mysqlhot 支持一次性拷貝多個資料庫,同時還支持正則表達。以下是幾個例子:

root#/usr/local/mysql/bin/mysqlhot -h=localhost -u=yejr -p=yejr db_name /tmp (把資料庫目錄 db_name 拷貝到 /tmp 下)
root#/usr/local/mysql/bin/mysqlhot -h=localhost -u=yejr -p=yejr db_name_1 ... db_name_n /tmp
root#/usr/local/mysql/bin/mysqlhot -h=localhost -u=yejr -p=yejr db_name./regex/ /tmp
更詳細的使用方法請查看手冊,或者調用下面的命令來查看 mysqlhot 的幫助:

perldoc /usr/local/mysql/bin/mysqlhot
注意,想要使用 mysqlhot,必須要有 SELECT、RELOAD(要執行 FLUSH TABLES) 許可權,並且還必須要能夠有讀取 datadir/db_name 目錄的許可權。

2.2 還原
mysqlhot 備份出來的是整個資料庫目錄,使用時可以直接拷貝到 mysqld 指定的 datadir (在這里是 /usr/local/mysql/data/)目錄下即可,同時要注意許可權的問題,如下例:

root#cp -rf db_name /usr/local/mysql/data/
root#chown -R nobody:nobody /usr/local/mysql/data/ (將 db_name 目錄的屬主改成 mysqld 運行用戶)

3、 SQL 語法備份
3.1 備份
BACKUP TABLE 語法其實和 mysqlhot 的工作原理差不多,都是鎖表,然後拷貝數據文件。它能實現在線備份,但是效果不理想,因此不推薦使用。它只拷貝表結構文件和數據文件,不同時拷貝索引文件,因此恢復時比較慢。例子:

BACK TABLE tbl_name TO '/tmp/db_name/';
注意,必須要有 FILE 許可權才能執行本SQL,並且目錄 /tmp/db_name/ 必須能被 mysqld 用戶可寫,導出的文件不能覆蓋已經存在的文件,以避免安全問題。

SELECT INTO OUTFILE 則是把數據導出來成為普通的文本文件,可以自定義欄位間隔的方式,方便處理這些數據。例子:

SELECT INTO OUTFILE '/tmp/db_name/tbl_name.txt' FROM tbl_name;
注意,必須要有 FILE 許可權才能執行本SQL,並且文件 /tmp/db_name/tbl_name.txt 必須能被 mysqld 用戶可寫,導出的文件不能覆蓋已經存在的文件,以避免安全問題。

3.2 恢復
用 BACKUP TABLE 方法備份出來的文件,可以運行 RESTORE TABLE 語句來恢復數據表。例子:

RESTORE TABLE FROM '/tmp/db_name/';
許可權要求類似上面所述。

用 SELECT INTO OUTFILE 方法備份出來的文件,可以運行 LOAD DATA INFILE 語句來恢復數據表。例子:

LOAD DATA INFILE '/tmp/db_name/tbl_name.txt' INTO TABLE tbl_name;
許可權要求類似上面所述。倒入數據之前,數據表要已經存在才行。如果擔心數據會發生重復,可以增加 REPLACE 關鍵字來替換已有記錄或者用 IGNORE 關鍵字來忽略他們。

補充:

shell> mysqlmp --quick db_name | gzip > db_name.contents.gz(該例子中創建的文件是壓縮格式)。

恢復/轉移到另一台的命令如下:

shell> gunzip < db_name.contents.gz | mysql db_name以上命令,適用於*nix 操作系統的機器

4、 啟用二進制日誌(binlog)
採用 binlog 的方法相對來說更靈活,省心省力,而且還可以支持增量備份。

啟用 binlog 時必須要重啟 mysqld。首先,關閉 mysqld,打開 my.cnf,加入以下幾行:

server-id = 1
log-bin = binlog
log-bin-index = binlog.index
然後啟動 mysqld 就可以了。運行過程中會產生 binlog.000001 以及 binlog.index,前面的文件是 mysqld 記錄所有對數據的更新操作,後面的文件則是所有 binlog 的索引,都不能輕易刪除。關於 binlog 的信息請查看手冊。

需要備份時,可以先執行一下 SQL 語句,讓 mysqld 終止對當前 binlog 的寫入,就可以把文件直接備份,這樣的話就能達到增量備份的目的了:

FLUSH LOGS;如果是備份復制系統中的從伺服器,還應該備份 master.info 和 relay-log.info 文件。

備份出來的 binlog 文件可以用 MySQL 提供的工具 mysqlbinlog 來查看,如:

/usr/local/mysql/bin/mysqlbinlog /tmp/binlog.000001
該工具允許你顯示指定的資料庫下的所有 SQL 語句,並且還可以限定時間范圍,相當的方便,詳細的請查看手冊。

恢復時,可以採用類似以下語句來做到:

/usr/local/mysql/bin/mysqlbinlog /tmp/binlog.000001 | mysql -uyejr -pyejr db_name
把 mysqlbinlog 輸出的 SQL 語句直接作為輸入來執行它。

如果你有空閑的機器,不妨採用這種方式來備份。由於作為 slave 的機器性能要求相對不是那麼高,因此成本低,用低成本就能實現增量備份而且還能分擔一部分數據查詢壓力,何樂而不為呢?

5、 直接備份數據文件
相較前幾種方法,備份數據文件最為直接、快速、方便,缺點是基本上不能實現增量備份。為了保證數據的一致性,需要在靠背文件前,執行以下 SQL 語句:

FLUSH TABLES WITH READ LOCK;也就是把內存中的數據都刷新到磁碟中,同時鎖定數據表,以保證拷貝過程中不會有新的數據寫入。這種方法備份出來的數據恢復也很簡單,直接拷貝回原來的資料庫目錄下即可。

注意,對於 Innodb 類型表來說,還需要備份其日誌文件,即 ib_logfile* 文件。因為當 Innodb 表損壞時,就可以依靠這些日誌文件來恢復。

6、 備份策略
對於中等級別業務量的系統來說,備份策略可以這么定:第一次全量備份,每天一次增量備份,每周再做一次全量備份,如此一直重復。而對於重要的且繁忙的系統來說,則可能需要每天一次全量備份,每小時一次增量備份,甚至更頻繁。為了不影響線上業務,實現在線備份,並且能增量備份,最好的辦法就是採用主從復制機制(replication),在 slave 機器上做備份。

7、 數據維護和災難恢復
作為一名DBA(我目前還不是,呵呵),最重要的工作內容之一是保證數據表能安全、穩定、高速使用。因此,需要定期維護你的數據表。以下 SQL 語句就很有用:

CHECK TABLE 或 REPAIR TABLE,檢查或維護 MyISAM 表
OPTIMIZE TABLE,優化 MyISAM 表
ANALYZE TABLE,分析 MyISAM 表
當然了,上面這些命令起始都可以通過工具 myisamchk 來完成,在這里不作詳述。

Innodb 表則可以通過執行以下語句來整理碎片,提高索引速度:

ALTER TABLE tbl_name ENGINE = Innodb;
這其實是一個 NULL 操作,表面上看什麼也不做,實際上重新整理碎片了。

通常使用的 MyISAM 表可以用上面提到的恢復方法來完成。如果是索引壞了,可以用 myisamchk 工具來重建索引。而對於 Innodb 表來說,就沒這么直接了,因為它把所有的表都保存在一個表空間了。不過 Innodb 有一個檢查機制叫 模糊檢查點,只要保存了日誌文件,就能根據日誌文件來修復錯誤。可以在 my.cnf 文件中,增加以下參數,讓 mysqld 在啟動時自動檢查日誌文件:

innodb_force_recovery = 4
關於該參數的信息請查看手冊。
有點長 慢慢看 對你應該有幫助

『捌』 闃塊噷浜慶pu媯嫻嬭繘紼媘ysql澶楂樻庝箞瑙e喅

銆銆涓鍙版湇鍔″櫒瑙e喅浜 Mysql cpu 鍗犵敤 100% 鐨勯棶棰樸傜◢鏁寸悊浜嗕竴涓嬶紝灝嗙粡楠岃板綍鍦ㄨ繖綃囨枃絝犻噷銆
銆銆鏈嬪弸涓繪満(Windows 2003 + IIS + PHP + MYSQL )榪戞潵 MySQL 鏈嶅姟榪涚▼ (mysqld-nt.exe) CPU 鍗犵敤鐜囨諱負 100% 楂樺眳涓嶄笅銆傛や富鏈烘湁10涓宸﹀彸鐨 database, 鍒嗗埆緇欏嶮涓緗戠珯璋冪敤銆傛嵁鏈嬪弸嫻嬭瘯錛屽艱嚧 mysqld-nt.exe cpu 鍗犵敤濂囬珮鐨勬槸緗戠珯A錛屼竴鏃﹀湪 IIS 涓灝嗘ょ綉絝欏仠姝㈡湇鍔★紝CPU 鍗犵敤灝遍檷涓嬫潵浜嗐備竴鍚鐢錛屽垯椹涓婁笂鍗囥
銆銆MYSQL CPU 鍗犵敤 100% 鐨勮В鍐寵繃紼
銆銆浠婂ぉ鏃╀笂浠旂粏媯鏌ヤ簡涓涓嬨傜洰鍓嶆ょ綉絝欑殑涓冩棩騫沖潎鏃 IP 涓2000錛孭ageView 涓 3涓囧乏鍙熾傜綉絝橝 鐢ㄧ殑 database 鐩鍓嶆湁39涓琛錛岃板綍鏁 60.1涓囨潯錛屽崰絀洪棿 45MB銆傛寜榪欎釜鏁版嵁錛孧ySQL 涓嶅彲鑳藉崰鐢ㄨ繖涔堥珮鐨勮祫婧愩備簬鏄鍦ㄦ湇鍔″櫒涓婅繍琛屽懡浠わ紝灝 mysql 褰撳墠鐨勭幆澧冨彉閲忚緭鍑哄埌鏂囦歡 output.txt錛
銆銆d:\web\mysql> mysqld.exe --help >output.txt鍙戠幇 tmp_table_size 鐨勫兼槸榛樿ょ殑 32M錛屼簬鏄淇鏀 My.ini, 灝 tmp_table_size 璧嬪煎埌 200M:
銆銆d:\web\mysql> notepad c:\windows\my.ini
銆銆[mysqld]
銆銆tmp_table_size=200M
銆銆鐒跺悗閲嶅惎 MySQL 鏈嶅姟銆侰PU 鍗犵敤鏈夎交寰涓嬮檷錛屼互鍓嶇殑CPU 鍗犵敤娉㈠艦鍥炬槸 100% 涓鏍圭洿綰匡紝鐜板湪鍒欏湪 97%~100%涔嬮棿璧蜂紡銆傝繖琛ㄦ槑璋冩暣 tmp_table_size 鍙傛暟瀵 MYSQL 鎬ц兘鎻愬崌鏈夋敼鍠勪綔鐢ㄣ備絾闂棰樿繕娌℃湁瀹屽叏瑙e喅銆
銆銆浜庢槸榪涘叆 mysql 鐨 shell 鍛戒護琛岋紝璋冪敤 show processlist, 鏌ョ湅褰撳墠 mysql 浣跨敤棰戠箒鐨 sql 璇鍙ワ細
銆銆mysql> show processlist;
銆銆鍙嶅嶈皟鐢ㄦゅ懡浠わ紝鍙戠幇緗戠珯 A 鐨勪袱涓 SQL 璇鍙ョ粡甯稿湪 process list 涓鍑虹幇錛屽叾璇娉曞備笅錛
銆銆SELECT t1.pid, t2.userid, t3.count, t1.dateFROM _mydata AS t1
銆銆LEFT JOIN _myuser AS t3 ON t1.userid=t3.useridLEFT JOIN _mydata_body AS t2 ON t1.pid=t3.pidORDER BY t1.pid
銆銆LIMIT 0,15
銆銆璋冪敤 show columns 媯鏌ヨ繖涓変釜琛ㄧ殑緇撴瀯 :
銆銆mysql> show columns from _myuser;
銆銆mysql> show columns from _mydata;
銆銆mysql> show columns from _mydata_body;
銆銆緇堜簬鍙戠幇浜嗛棶棰樻墍鍦錛歘mydata 琛錛屽彧鏍規嵁 pid 寤虹珛浜嗕竴涓 primary key錛屼絾騫舵病鏈変負 userid 寤虹珛緔㈠紩銆傝屽湪榪欎釜 SQL 璇鍙ョ殑絎涓涓 LEFT JOIN ON 瀛愬彞涓錛
銆銆LEFT JOIN _myuser AS t3 ON t1.userid=t3.userid_mydata 鐨 userid 琚鍙備笌浜嗘潯浠舵瘮杈冭繍綆椼備簬鏄鎴戜負緇 _mydata 琛ㄦ牴鎹瀛楁 userid 寤虹珛浜嗕竴涓緔㈠紩錛
銆銆mysql> ALTER TABLE `_mydata` ADD INDEX ( `userid` )寤虹珛姝ょ儲寮曚箣鍚庯紝CPU 椹涓婇檷鍒頒簡 80% 宸﹀彸銆傜湅鍒版壘鍒頒簡闂棰樻墍鍦錛屼簬鏄媯鏌ュ彟涓涓鍙嶅嶅嚭鐜板湪 show processlist 涓鐨 sql 璇鍙ワ細
銆銆SELECT COUNT(*)
銆銆FROM _mydata AS t1, _mydata_key AS t2
銆銆WHERE t1.pid=t2.pid and t2.keywords = '瀛旈泙'
銆銆緇忔鏌 _mydata_key 琛ㄧ殑緇撴瀯錛屽彂鐜板畠鍙涓 pid 寤轟簡浜 primary key, 娌℃湁涓 keywords 寤虹珛 index銆俖mydata_key 鐩鍓嶆湁 33 涓囨潯璁板綍錛屽湪娌℃湁緔㈠紩鐨勬儏鍐典笅瀵33涓囨潯璁板綍榪涜屾枃鏈媯緔㈠尮閰嶏紝涓嶈楄垂澶ч噺鐨 cpu 鏃墮棿鎵嶆銆傜湅鏉ュ氨鏄閽堝硅繖涓琛ㄧ殑媯緔㈠嚭闂棰樹簡銆備簬鏄鍚屾牱涓 _mydata_key 琛ㄦ牴鎹瀛楁 keywords 鍔犱笂緔㈠紩:
銆銆mysql> ALTER TABLE `_mydata_key` ADD INDEX ( `keywords` )寤虹珛姝ょ儲寮曚箣鍚庯紝CPU絝嬪埢闄嶄簡涓嬫潵錛屽湪 50%~70%涔嬮棿闇囪崱銆
銆銆鍐嶆¤皟鐢 show prosslist錛岀綉絝橝 鐨剆ql 璋冪敤灝卞緢灝戝嚭鐜板湪緇撴灉鍒楄〃涓浜嗐備絾鍙戠幇姝や富鏈鴻繍琛屼簡鍑犱釜 Discuz 鐨勮哄潧紼嬪簭錛 Discuz 璁哄潧鐨勫ソ鍑犱釜琛ㄤ篃瀛樺湪鐫榪欎釜闂棰樸備簬鏄欏烘墜涓騫惰В鍐籌紝cpu鍗犵敤鍐嶆¢檷涓嬫潵浜嗐(2007.07.09 闄勬敞錛氬叧浜 discuz 璁哄潧鐨勫叿浣撲紭鍖栬繃紼嬶紝鎴戝悗鏉ュ彟鍐欎簡涓綃囨枃絝狅紝璇﹁侊細鍗冧竾綰ц板綍鐨 Discuz! 璁哄潧瀵艱嚧 MySQL CPU 100% 鐨 浼樺寲絎旇 http://www.xiaohui.com/dev/server/20070701-discuz-mysql-cpu-100-optimize.htm)瑙e喅 MYSQL CPU 鍗犵敤 100% 鐨勭粡楠屾葷粨
銆銆澧炲姞 tmp_table_size 鍊箋俶ysql 鐨勯厤緗鏂囦歡涓錛宼mp_table_size 鐨勯粯璁ゅぇ灝忔槸 32M銆傚傛灉涓寮犱復鏃惰〃瓚呭嚭璇ュぇ灝忥紝MySQL浜х敓涓涓 The table tbl_name is full 褰㈠紡鐨勯敊璇錛屽傛灉浣犲仛寰堝氶珮綰 GROUP BY 鏌ヨ錛屽炲姞 tmp_table_size 鍊箋 榪欐槸 mysql 瀹樻柟鍏充簬姝ら夐」鐨勮В閲婏細
銆銆tmp_table_size
銆銆This variable determines the maximum size for a temporary table in memory. If the table becomes too large, a MYISAM table is created on disk. Try to avoid temporary tables by optimizing the queries where possible, but where this is not possible, try to ensure temporary tables are always stored in memory. Watching the processlist for queries with temporary tables that take too long to resolve can give you an early warning that tmp_table_size needs to be upped. Be aware that memory is also allocated per-thread. An example where upping this worked for more was a server where I upped this from 32MB (the default) to 64MB with immediate effect. The quicker resolution of queries resulted in less threads being active at any one time, with all-round benefits for the server, and available memory.
銆銆瀵 WHERE, JOIN, MAX(), MIN(), ORDER BY 絳夊瓙鍙ヤ腑鐨勬潯浠跺垽鏂涓鐢ㄥ埌鐨勫瓧孌,搴旇ユ牴鎹鍏跺緩絝嬬儲寮 INDEX銆傜儲寮曡鐢ㄦ潵蹇閫熸壘鍑哄湪涓涓鍒椾笂鐢ㄤ竴鐗瑰畾鍊肩殑琛屻傛病鏈夌儲寮曪紝MySQL涓嶅緱涓嶉栧厛浠ョ涓鏉¤板綍寮濮嬪苟鐒跺悗璇誨畬鏁翠釜琛ㄧ洿鍒板畠鎵懼嚭鐩稿叧鐨勮屻傝〃瓚婂ぇ錛岃姳璐規椂闂磋秺澶氥傚傛灉琛ㄥ逛簬鏌ヨ㈢殑鍒楁湁涓涓緔㈠紩錛孧ySQL鑳藉揩閫熷埌杈句竴涓浣嶇疆鍘繪悳瀵誨埌鏁版嵁鏂囦歡鐨勪腑闂達紝娌℃湁蹇呰佽冭檻鎵鏈夋暟鎹銆傚傛灉涓涓琛ㄦ湁1000琛岋紝榪欐瘮欏哄簭璇誨彇鑷沖皯蹇100鍊嶃傛墍鏈夌殑MySQL緔㈠紩(PRIMARY銆乁NIQUE鍜孖NDEX)鍦˙鏍戜腑瀛樺偍銆傛牴鎹 mysql 鐨勫紑鍙戞枃妗:
銆銆緔㈠紩 index 鐢ㄤ簬錛
銆銆蹇閫熸壘鍑哄尮閰嶄竴涓猈HERE瀛愬彞鐨勮
銆銆褰撴墽琛岃仈緇(JOIN)鏃訛紝浠庡叾浠栬〃媯緔㈣屻
銆銆瀵圭壒瀹氱殑緔㈠紩鍒楁壘鍑篗AX()鎴朚IN()鍊
銆銆濡傛灉鎺掑簭鎴栧垎緇勫湪涓涓鍙鐢ㄩ敭鐨勬渶宸﹂潰鍓嶇紑涓婅繘琛(渚嬪傦紝ORDER BY key_part_1,key_part_2)錛屾帓搴忔垨鍒嗙粍涓涓琛ㄣ傚傛灉鎵鏈夐敭鍊奸儴鍒嗚窡闅廌ESC錛岄敭浠ュ掑簭琚璇誨彇銆
銆銆鍦ㄤ竴浜涙儏鍐典腑錛屼竴涓鏌ヨ㈣兘琚浼樺寲鏉ユ緔㈠礆紝涓嶇敤鍜ㄨ㈡暟鎹鏂囦歡銆傚傛灉瀵規煇浜涜〃鐨勬墍鏈変嬌鐢ㄧ殑鍒楁槸鏁板瓧鍨嬬殑騫朵笖鏋勬垚鏌愪簺閿鐨勬渶宸﹂潰鍓嶇紑錛屼負浜嗘洿蹇錛屽煎彲浠ヤ粠緔㈠紩鏍戣媯緔㈠嚭鏉ャ傚亣瀹氫綘鍙戝嚭涓嬪垪SELECT璇鍙ワ細
銆銆mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;濡傛灉涓涓澶氬垪緔㈠紩瀛樺湪浜巆ol1鍜宑ol2涓婏紝閫傚綋鐨勮屽彲浠ョ洿鎺ヨ鍙栧嚭銆傚傛灉鍒嗗紑鐨勫崟琛屽垪緔㈠紩瀛樺湪浜巆ol1鍜宑ol2涓婏紝浼樺寲鍣ㄨ瘯鍥鵑氳繃鍐沖畾鍝涓緔㈠紩灝嗘壘鍒版洿灝戠殑琛屽苟鏉ユ壘鍑烘洿鍏烽檺鍒舵х殑緔㈠紩騫朵笖浣跨敤璇ョ儲寮曞彇琛屻
銆銆寮鍙戜漢鍛樺仛 SQL 鏁版嵁琛ㄨ捐$殑鏃跺欙紝涓瀹氳侀氱洏鑰冭檻娓呮氥

熱點內容
a演算法概念 發布:2024-11-25 21:24:16 瀏覽:587
jquery源碼書籍 發布:2024-11-25 21:19:50 瀏覽:803
銀行卡輸入密碼超限怎麼辦 發布:2024-11-25 21:09:07 瀏覽:958
編譯指令多發 發布:2024-11-25 20:58:17 瀏覽:751
java上傳文件到伺服器 發布:2024-11-25 20:52:47 瀏覽:741
軸加工編程 發布:2024-11-25 20:52:12 瀏覽:412
手機的媒體存儲 發布:2024-11-25 20:29:42 瀏覽:265
安卓如何關閉手機桌面 發布:2024-11-25 20:24:37 瀏覽:701
腳本也違法嗎 發布:2024-11-25 20:24:24 瀏覽:305
phpeol 發布:2024-11-25 20:16:01 瀏覽:93