日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL备份恢复与日志

發布時間:2025/3/15 数据库 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL备份恢复与日志 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MySQL 數據庫的備份與恢復

1.1 備份數據的意義

第一是保護公司的數據,第二是網站7*24小時提供服務

1.2 備份單個數據庫參數使用

MySQL數據庫自帶了一個很好用的備份命令,就是mysqldump,它的基本使用如下; 語法:mysqldump -u 用戶名 -p ?數據庫名 > 備份的文件名
  • mysqldump -uroot -p123456 -S /data/3306/mysql.sock oldboy >/opt/oldboy_$(date +%F).sql
  • 我們可以使用grep 查看我們都備份了些什么東西
  • [root@db02 oldboy]# egrep -v "#|\*|--|^$" /opt/oldboy_2016-06-22.sql
  • DROP TABLE IF EXISTS `student`;
  • CREATE TABLE `student` (
  • ? `id` int(4) NOT NULL AUTO_INCREMENT,
  • ? `name` char(20) NOT NULL,
  • ? `age` tinyint(2) NOT NULL DEFAULT '0',
  • ? `dept` varchar(16) DEFAULT NULL,
  • ? PRIMARY KEY (`id`),
  • ? KEY `index_name` (`name`),
  • ? KEY `index_age` (`name`(8)),
  • ? KEY `ind_name_dept` (`name`,`dept`)
  • ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • LOCK TABLES `student` WRITE;
  • UNLOCK TABLES;
  • DROP TABLE IF EXISTS `test`;
  • CREATE TABLE `test` (
  • ? `id` int(4) NOT NULL AUTO_INCREMENT,
  • ? `name` char(20) NOT NULL,
  • ? PRIMARY KEY (`id`)
  • ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;
  • LOCK TABLES `test` WRITE;
  • INSERT INTO `test` VALUES (1,'oldboy'),(2,'oldgirl'),(3,'inca'),(4,'zuma'),(5,'kaka');
  • UNLOCK TABLES;
  • 小結:mysqldump就是備份了我們的sql語句 mysqldump常用參數說明:

    參數

    說明

    -A

    備份所有數據庫

    -B

    增加創建數據庫和連接數據庫的語句

    -t

    只備份數據

    -d

    只備份庫表結構

    -T

    分離庫表和數據成不同的文件,數據是文本,非SQL語句

    -x

    鎖表 禁止寫入數據

    -F

    刷新binlog日志,生成新的文件,將來增量恢復使用

    我們這里只是簡單的介紹了一下mysqldump的參數,更多參數可以參考本站的mysqldump參數介紹

    1.3 常用命令介紹

    -B?
    使用-B 參數

    mysqldump
    -uroot -p123456 -S /data/3306/mysql.sock -B oldboy >/opt/oldboy_B_$(date
    +%F).sql

    不使用-B 參數

    [root@db02
    oldboy]# mysql -uroot -p123456 -S /data/3306/mysql.sock
    </opt/oldboy_2016-06-22.sql?

    小結:如果不加-B?恢復的時候需要提前創建好數據庫并指定

    –compact 測試時用的比較多,可以優化輸出內容的大小,讓容量更少,適合調試 參數說明:該選項使得輸出內容更簡潔,不包括默認選項中各種注釋,有如下幾個參數。–skip-add-drop-table –no-set-names
    –skip-disable-keys –skip-add-locks 語法如下:
  • mysqldump -uroot -p123456 -S /data/3306/mysql.sock -B oldboy --compact >/opt/123.sql
  • gzip
  • mysqldump -uroot -p123456 -S /data/3306/mysql.sock -B oldboy|gzip>/opt/123.sql.gz
  • -rw-r--r-- ?1 root root ?899 Jun 22 17:34 123.sql.gz
  • -rw-r--r-- ?1 root root 1014 Jun 22 17:27 123.sql
  • 使用gzip壓縮打包文件效率是不壓縮的3倍

    以上參數小結

  • 備份數據使用-B參數,會在備份數據中增加建庫的語句。
  • 備份數據使用-B參數,后面可以直接接多個庫名
  • 用gzip對備份的數據壓縮,可以提高效率
  • debug時可以用–compact減少輸出,但不用于生產
  • 指定字符集備份用–default-character-set=latin1(一般不用此字符集)
  • mysqldump的工作原理?

    利用mysqldump命令備份數據的過程,實際上就是把數據從mysql庫里以邏輯的sql語句的形式直接輸出或生產備份文件的過程 備份多個庫語法如下:
  • mysqldump -uroot -p123456 -S /data/3306/mysql.sock -B oldboy wordpress >/opt/123.sql
  • 提示:使用mysqldump是把數據庫的數據導出通過sql語句的形式存儲,這種備份方式成稱為邏輯備份,效率不是很高,一般50G以內的數據。
  • 其他的備份方式:物理備份cp、tar(停庫),xtrabackup
  • 1.4 如果做分庫分表

    分庫備份實際上就是執行一個備份語句備份一個庫,如果數據庫里有多個庫,就執行多條相同的備份單個的備份語句就可以備份多個庫了。注意每個庫都可以對應備份的庫作為庫名,結尾加sql備份多個庫的命令如下:
  • mysqldump -uroot -p123456 -B oldboy
  • mysqldump -uroot -p123456 -B oldboy_gbk
  • 分庫的備份語法:

    先取出我們要備份的庫
  • [root@db02 oldboy]# mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show databases;"|egrep -v "Database|_schema|mysql"
  • cyh
  • oldboy
  • oldboy123
  • oldboy_gbk
  • wordpress
  • 執行命令,進行批量備份

  • mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show databases;"|egrep -v "Database|_schema|mysql"|sed -r 's#^(.*)#mysqldump -uroot -p123456 -S /data/3306/mysql.sock -B \1 >/tmp/\1.sql.gz#g'|bash
  • ?查看最后結果

  • [root@db02 tmp]# ll
  • total 20
  • -rw-r--r-- 1 root root??? 0 Jun 21 11:55 bak.sql
  • -rw-r--r-- 1 root root 1382 Jun 22 17:55 cyh.sql.gz
  • -rw-r--r-- 1 root root 1406 Jun 22 17:55 oldboy123.sql.gz
  • -rw-r--r-- 1 root root 1409 Jun 22 17:55 oldboy_gbk.sql.gz
  • -rw-r--r-- 1 root root 2808 Jun 22 17:55 oldboy.sql.gz
  • -rw-r--r-- 1 root root 1406 Jun 22 17:55 wordpress.sql.gz
  • 提示:可以使用for循環進行備份 備份單個表
  • mysqldump -uroot -p123456 -S /data/3306/mysql.sock oldboy test >/opt/test.sql
  • 備份多個表
  • mysqldump -uroot -p123456 -S /data/3306/mysql.sock oldboy test cyh>/opt/test.sql
  • [提示]只要不加-B 前面是庫,后面的都是表 只顯示表結構
  • mysqldump -uroot -p123456 -S /data/3306/mysql.sock oldboy test? -d >/opt/test.sql
  • 直接備份數據 -t參數
  • mysqldump -uroot -p123456 -S /data/3306/mysql.sock oldboy test? -t>/opt/test.sql
  • 備份數據庫表結構(不包含數據)

    利用mysqldump -d?參數只備份表的結構,例:備份oldboy所有表結構

  • mysqldump -uroot -p123546 -B -d oldboy >/opt/t.sql
  • 語句和數據分離,數據為文本 -T -tab=name
  • mysqldump -uroot -p123456 oldboy student –compact –tab=/tmp/
  • cat /tmp/student.txt
  • oldboy
  • oldgirl
  • inca
  • ?zuma
  • 刷新binlog

    mysqldump用于定時對某一時刻的數據的全備,例如:00點進行備份back.sql.gz

    增量備份:當有數據寫入到數據庫時,還會同時把更新的SQL語句寫入到對應的文件里這個就叫做binlog文件

  • mysqldump -uroot -p123456 -S /data/3306/mysql.sock oldboy test -F --compact
  • -F 在/data/3306就會記錄mysql-bin.000005 按照循序設置,刷新binglog日志,在備份之后立刻刷新binlog日志

  • 刷新binlog介紹
  • binlog是記錄數據庫更新的SQL語句,二進制文件
  • mysqldump永不定時對某一時刻數據的全備,例如:00點進行備份bak.sql.gz
  • 增量備份:當有數據寫入到數據庫時,還會同時把更新的SQL語句寫入到對應的文件里
  • 這個文件就叫做binlog文件
  • 例子:10點丟失數據需要恢復數據;
    • 00點時刻備份的bak.sql.gz 數據還原到數據庫,這個時候恢復到了00點
    • 00點-10:00數據,就要從binlog里恢復
    binlog文件生效需要有一個參數:binlog binlog日志切割:確定全備和增量的臨界點
    • -F 刷新binlog日志,生成新文件,將來恢復從這個文件開始。
    • –maser-data在備份語句里添加CHANGE MASTER語句及binlog文件位置點信息
    • 值為1=可執行的CHANGE MASTER語句
    • 值為2=注釋的–CHANGE MASTER語句
    • –master-data除了增量恢復確定臨界點外,做主從復制時作用更大。

    1.5 生產場景不同引擎mysqldump備份命令

    MyISAM引擎企業生產備份命令(適合所有引擎和混合引擎)
  • mysqldump -uroot -poldboy123 -A -B -F -R --master-data=2 -x --events|gzip >/opt/all.sql.gz
  • 提示:-F 也可以不用,與--master-data有些重復
  • innoDB引擎企業生產備份命令;推薦使用的
  • mysqldump -uroot —poldboy123 -A -B -F -R --master-data=2 --events --single-transaction|gzip >/opt/all.sql.gz
  • 提示:-F 也可以不用,與--master-data
  • 額外補充: (一)mysqldump邏輯備份說明 缺點:效率不是特別高。 優點:簡單、方便、可靠、遷移 適用于數據量不是特別大的場景,打包前50G以內數據 (二)超過50G可選方案 1、xtrabackup物理備份工具:全量和增量(支持熱備) 2、物理備份方案:從庫停止SQL線程,打包,cp 數據庫恢復事項 提示: 1.數據恢復和字符集關聯很大,如果字符集不正確會導致恢復的數據亂碼 2.mysql命令以及source命令恢復數據庫的原理就是把文件的sql語句,在數據庫重新執行的過程 小技巧
  • Mysql>system ls -l /opt/ ?可以跳出mysql查看命令
  • Mysql>source /opt/oldboy_B.sql ?直接接路徑就可以恢復
  • source數據恢復和字符集關聯很大,如果字符集不正確會導致恢復的數據亂碼
  • UTF8數據庫,那么恢復的文件格式需要為"UTF8-沒有簽名"格式,txt右擊另存為設置
  • 1.6 MySQL恢復命令

    針對壓縮的備份數據恢復; 1、方法
  • gzip -d /opt/mysql.sql.gz
  • mysql -uroot -poldboy </opt/mysql.sql
  • 不刪除源備份文件:
  • gzip -cd 01.sql.gz >2.sql
  • 2、方法
  • gunzip<b_bak.sql.gz>/opt/mysql.sql
  • mysql -uroot -poldboy </opt/mysql.sql
  • 或者
  • gunzip <b_bak.sql.gz|mysql -uroot -poldboy123
  • 恢復總結: 1、source命令 2、mysql命令

    1.7 實現和MySQL非交互式對話

    1.7.1 利用mysql -e 參數查看mysql數據

  • [root@www ~]# mysql -uroot -p -e "show databases;"
  • Enter password:?
  • +--------------------+
  • | Database ? ? ? ? ? |
  • +--------------------+
  • | information_schema |
  • | bbs ? ? ? ? ? ? ? ?|
  • | mysql ? ? ? ? ? ? ?|
  • | performance_schema |
  • | test ? ? ? ? ? ? ? |
  • | wordpress ? ? ? ? ?|
  • +--------------------+
  • 查看完整的線程狀態,此參數才查看慢查詢語句是非常有用
  • [root@www ~]# mysql -uroot -p -e "show full processlist;"
  • Enter password:?
  • +-----+------+-----------+------+---------+------+-------+-----------------------+
  • | Id ?| User | Host ? ? ?| db ? | Command | Time | State | Info ? ? ? ? ? ? ? ? ?|
  • +-----+------+-----------+------+---------+------+-------+-----------------------+
  • | 797 | root | localhost | NULL | Query ? | ? ?0 | NULL ?| show full processlist |
  • +-----+------+-----------+------+---------+------+-------+-----------------------+
  • 企業案例:mysql sleep線程過多的問題案例
  • mysql> show processlist;
  • mysql>kill 89; ?可以使用kill 殺死進程
  • ============================================= mysql sleep線程過多問題 在配置文件修改:
  • [mysqld]
  • interactive_timeout = 120 ?<==此參數設置后wait_timout自動失效
  • wait_timeout = 120
  • 其他方法: 1、PHP程序中,不使用持續連接,即使用mysql_connect而不是pconnect(JAVA調整連接池) 2、PHP程序執行完畢,應該顯示調用mysql_close 3、逐漸分析MySQL的SQL查詢及慢查詢日志,找到查詢過慢的SQL,優化

    1.8 不重啟數據庫修改數據庫參數

    不重啟數據庫修改數據庫參數,但是要求重啟后還能生效
  • shell>mysql -uroot -poldboy -e "show variables;"|grep key_buffer
  • key_buffer_size 16384
  • shell>mysql -uroot -poldboy -e "set global key_buffer_size = 1024*32;"
  • shell>mysql -uroot -poldboy -e "show variables;"|grep key_buffer
  • key_buffer_size 32768
  • shell>sed -n '32p' /etc/my.cnf
  • key_buffer_size = 16K
  • shell>sed -i 's#key_buffer_size = 16K#key_buffer_size = 32K#g' /etc/my.cnf
  • 查看數據庫參數是否生效

  • mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show variables\G"
  • [root@db02 opt]# mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show variables like '%server_id%';"
  • +---------------+-------+
  • | Variable_name | Value |
  • +---------------+-------+
  • | server_id???? | 1???? |
  • +---------------+-------+
  • 查看my配置文件有沒有在數據庫中生效

    ?

  • [root@db02 opt]# mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show variables like '%log_bin%';"
  • +---------------------------------+-------+
  • | Variable_name?????????????????? | Value |
  • +---------------------------------+-------+
  • | log_bin???????????????????????? | ON??? |
  • | log_bin_trust_function_creators | OFF?? |
  • | sql_log_bin???????????????????? | ON??? |
  • +---------------------------------+-------+
  • [root@db02 opt]# mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show variables like '%slow_%';"
  • +---------------------+-------------------------------+
  • | Variable_name?????? | Value???????????????????????? |
  • +---------------------+-------------------------------+
  • | log_slow_queries??? | OFF?????????????????????????? |
  • | slow_launch_time??? | 2???????????????????????????? |
  • | slow_query_log????? | OFF?????????????????????????? |
  • | slow_query_log_file | /data/3306/data/db02-slow.log |
  • +---------------------+-------------------------------+
  • 索引緩沖區
  • [root@db02 opt]# mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show variables like '%key_buffer%';"
  • +-----------------+----------+
  • | Variable_name?? | Value??? |
  • +-----------------+----------+
  • | key_buffer_size | 16777216 |
  • +-----------------+----------+

  • 修改索引緩沖區的大小

  • set global key_buffer_size = 1024*1024*32;
  • root@oldboy 11:03:59->show variables like '%key_buffer%';
  • +-----------------+----------+
  • | Variable_name?? | Value??? |
  • +-----------------+----------+
  • | key_buffer_size | 33554432 |
  • +-----------------+----------+
  • 1 row in set (0.00 sec)
  • 不重啟數據庫更改數據庫參數小結: 1、set global key_buffer_size = 1024*1024*32; ?#<==及時生效,重啟mysql失效 2、配置文件也要改,編輯/etc/my.cnf,修改key_buffer_size = 32M 1.9 生產場景通常重要命令小結
  • show processlist; ?#查看數據庫正在執行的SQL語句,可能無法看全完整SQL語句
  • show full prcesslist #查看正在執行的完整SQL語句,完整顯示
  • set global key_buffer_size = 1024*1024*32 ?#不重啟數據庫調整數據庫參數,直接生效,重啟后失效、
  • show variables; ?#查看數據庫的配置參數信息,例如:my.cnf里參數的生效情況
  • kill ID???? #殺掉SQL線程的命令,ID為線程號
  • show session status ?#查看當前會話的數據庫狀態信息
  • show global status;? #查看整個數據庫運行狀態信息,很重要。要分析并做好監控
  • show status;??? #mysql運行狀態
  • show engine innodb status; #顯示InnoDB 引擎的性能狀態(早起版本show innodb status)
  • 查看select進行的查看次數
  • root@oldboy 11:22:46->show global status like '%select%'; ? ? ?
  • +------------------------+-------+
  • | Variable_name????????? | Value |
  • +------------------------+-------+
  • | Com_insert_select????? | 0???? |
  • | Com_replace_select???? | 0???? |
  • | Com_select???????????? | 264?? |? ? ? ? ? ??
  • | Select_full_join?????? | 0???? |
  • | Select_full_range_join | 0???? |
  • | Select_range?????????? | 7???? |
  • | Select_range_check???? | 0???? |
  • | Select_scan??????????? | 287?? |
  • +------------------------+-------+
  • 8 rows in set (0.00 sec)
  • 查看查詢和寫入的次數
  • [root@db02 opt]# mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show status ;"|grep -E "select|insert"
  • Com_insert???? 0
  • Com_insert_select? 0
  • Com_replace_select?????? 0
  • Com_select???? 1
  • Delayed_insert_threads 0
  • Innodb_rows_inserted?? 117
  • Qcache_inserts????? 58
  • 過濾出innodb引擎的參數
  • [root@db02 opt]# mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show status ;"|grep -E "select|insert"
  • Com_insert???? 0
  • Com_insert_select? 0
  • Com_replace_select?????? 0
  • Com_select???? 1
  • Delayed_insert_threads 0
  • Innodb_rows_inserted?? 117
  • Qcache_inserts????? 58
  • 查看引擎innodb狀態
  • show gengine innodb status\G
  • MySQL工具mysqlbinlog

    2.1 mysql的binlog日志是什么?

    mysql數據目錄下的如下文件就是mysql的binlog日志
  • 多實例路徑:/data/3306/
  • mysql-bin.00001
  • mysql-bin.00002
  • mysql-bin.00003
  • mysql-bin.00004
  • mysql-bin.00005
  • 需要在配置文件中開啟次功能
  • grep log-bin my.cnf
  • log-bin = /data/3306/mysql-bin
  • 主要作用:用于數據庫的主從復制以及數據的增量恢復? ??

    2.2 mysqlbinlog工具解析binlog日志實踐

    默認情況binlog日志是二進制格式的,不能使用查看文本工具的命令來查看,例如:cat vi vim 2.3 解析指定庫的binlog日志 范例:利用mysqldump -d參數解析指定庫的binlog日志
  • shell>mysqlbinglog -d oldboy mysql-bin.00001 -r oldboy.sql
  • 提示:-r代表>輸出內容 -d 指定庫文件
  • mysql-bin.000001內容介紹
  • # at 2154
  • #160630 ?7:45:07 server id 1 ?end_log_pos 2253 Query thread_id=11 exec_time=0 error_code=0
  • SET TIMESTAMP=1467243907/*!*/;
  • create database qqqqqqq41233
  • /*!*/;
  • DELIMITER ;
  • # End of log file
  • ROLLBACK /* added by mysqlbinlog */;
  • /*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
  • /*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;
  • 按照位置截取:確定

  • # at 2154
  • #160630 ?7:45:07
  • mysqlbinlog mysql-bin.000001 --start-position=2156 --stop-position=3000 -r pos.sql
  • 其中,--start-posistion可以在配置文件中不存在,那時候取值將會取最接近2156的值
  • 按照時間截圖:模糊,不準

  • mysqlbinlog mysql-bin.00001 --start-datetime='2016-10-16 17:14:15' --stop-datetime='2014-10-16 17:15:15' -r time.sql
  • 指定開始時間,不指定結束時間,將從開始時間一直到最后
  • mysqlbinlog mysql-bin.000001 --start-datetime='2016-10-16 17:14:15' -r time.sql
  • 指定結束時間,不指定開始時間,將從開始一直到指定的結束時間
  • mysqlbinlog mysql-bin.000002 --stop-datetime='2016-10-16 17:14:15' -r time.sql
  • mysqlbinlog命令

    1、把binlog解析為sql語句(包含位置和時間點) 2、-d參數genuine指定庫拆分binlog(拆分單表binlog可通過SQL關鍵字過濾) 3、通過位置參數獲取部分binlog: –start-position=301 –stop-position=305。精準定位取部分內容 4、通過時間參數截取部分binlog,–start-datetime=’2016-10-16 17:14:15′ –stop-datetime=’2016-10-16 17:17:17’,模糊取部分內容,會丟失數據。 5、-r 文件名,相當于”>文件名” 6、解析ROW級別binlog日志的方法。
  • mysqlbinlog --base64-ouput=decode-rows-v mysql-bin.00001
  • mysqlbinlog --base64-ouput="decode-rows" --verbose-mysql-bin.00001
  • 2.3 錯誤日志(error log)介紹與調整

    1.錯誤日志(error log)介紹 MySQL的錯誤日志(error log)記錄MySQL服務進程mysqld在啟動/關閉或運行過程中遇到的錯誤信息 2.錯誤日志(error log)實踐

    法1:在配置文件中調整方法,當然可以在啟動時加入啟動參數

  • [mysqld_safe]
  • log-error=/data/3306/mysql_oldboy3306.err
  • 法2:啟動MySQL命令里加入:

  • mysqld_safe --default-file=/data/3306/my.cnf --log-error=/data/3306/mysql_oldboy.err &
  • root@oldboy 10:09:14->show variables like '%log_error%';
  • +---------------+---------------------------------+
  • | Variable_name | Value ? ? ? ? ? ? ? ? ? ? ? ? ? |
  • +---------------+---------------------------------+
  • | log_error ? ? | /data/3306/mysql_oldboy3306.err |
  • +---------------+---------------------------------+
  • 1 row in set (0.04 sec)
  • 新裝MySQL服務,無法啟動排查思路

    1.把/data/3306/data 目錄刪除后重新建立data目錄并加屬主屬組 2.把原有的my.cnf,mysql這兩個也重新還原過 3.重新用mysqld_safe啟動過 4.改過my.cnf里面server-id = 2 5.配置文件里面的端口,思路

    步驟———————————-

    1、先把日志文件備份并清空啟動一下mysql服務然后再查看日志文件報有什么錯誤?
  • [root@db02 3306]# cat mysql_oldboy3306.err
  • 160616 16:46:07 mysqld_safe Starting mysqld daemon with databases from /data/3306/data
  • 2、然后mysql3306目錄下面所有文件都加上屬主并是遞歸-R
  • [root@db02 3306]# chown -R mysql *
  • 3、然后查看一下有沒有mysql 這個ID
  • [root@db02 3306]# id mysql
  • uid=502(mysql) gid=502(mysql) groups=502(mysql)
  • 4、重新啟動mysql服務(多實例)
  • [root@db02 3306]#/data/3306/mysql start
  • 5、此時再查看一下服務有沒有啟動起來
  • [root@db02 3306]#lsof -i:3306
  • 2.4 查詢日志(也可以叫做訪問日志)

  • [root@db02 ~]grep gene /data/3306/my.cnf
  • general_log = on
  • general_log_file = /data/3306/data/MySQL_oldboy.log
  • 會記錄mysql所有的操作 提示:高并發場景企業里普通查詢日志一般是關閉的(默認也是關閉)主要因為IO性能問題 2.5 慢查詢日志(slow query log )介紹與調整***** 1.慢查詢日志(slow query log)介紹 慢查詢日志(slow query log);記錄執行時間超出指定值(long_query_time)的SQL語句 2.慢查詢日志(slow query log)調整
  • long_query_time=超過指定時間查詢(看公司要求,通常2秒)
  • log-slow-queries= 日志路徑
  • log_queries_not_using_indexes=不使用索引
  • 慢查詢的設置,對于數據庫SQL的優化非常重要
  • [root@db02 oldboy]# egrep "quer" /data/3306/my.cnf|tail -3
  • long_query_time = 1
  • log-slow-queries = /data/3306/slow.log
  • log_queries_not_using_indexes
  • 2.6 慢查詢日志切割

  • shell>cat /server/scripts/cut_slow_log.sh
  • cd /data/3306/ &&\
  • /bin/mv slow.log slow.log.$(date +%F)&&\
  • mysqladmin -uroot -poldboy123 -S /data/3306/mysql.sock flush-log
  • shell>tail -2 /var/spool/cron/root
  • #cut mysql slow log
  • 00 00 * * * /bin/sh /server/scripts/cur_slow_log.sh >/dev/null 2>&1
  • 使用explain優化SQL語句(select語句)的基礎流程;

    1.抓慢查詢SQL語句方法:

    a. show full prcesslist;(登錄數據庫現場抓,連續執行2次,超過2秒) mysql -uroot -poldboy -S /data/3306/mysql.sock -e “show full processlist;”|egrep -vi “sleep” b.分析慢查詢日志 配置參數記錄慢查詢語句

    2.explain語句檢查索引執行情況

    大表不能高峰期建立索引,300萬條記錄

    3.分析慢查詢的工具mysqlsla(每天早上發郵件)

    切割慢查詢日志,去重分析后發給領導及相關部門 1)mv,reload進程。2)cp,>清空
  • shell>mv /data/3306/slow.log /opt/$(date +%F)_slow.log
  • shell>mysqladmin -uroot -poldboy -S /data/3306/mysql.sock flush-logs
  • mysqlsla分析:http://blog.itpub.net/7607759/viewspace-692828
  • 2.7 二進制日志(binary log)介紹與調整

    1、二進制日志(binary log)介紹 二進制日志(binary log)記錄數據表被修改的相關信息; 2.二進制日志(binary log)調整
  • root@oldboy 11:13:37->show variables like '%log_bin%';
  • +---------------------------------+-------+
  • | Variable_name ? ? ? ? ? ? ? ? ? | Value |
  • +---------------------------------+-------+
  • | log_bin ? ? ?記錄binlog開關 ? ? ?| ON ? ?|
  • | log_bin_trust_function_creators | OFF ? |
  • | sql_log_bin 臨時不記錄binlog開關(增量恢復)| ON?
  • +---------------------------------+-------+
  • 3 rows in set (0.01 sec)
  • 可以在配置文件中設置
  • [root@db02 3306]# grep log-bin /data/3306/my.cnf
  • log-bin = /data/3306/mysql-bin
  • 二進制日志log-bin作用;

    1、以二進制形式記錄更改數據庫的SQL語句。 2、用于主從復制。 3、增量數據備份及恢復 臨時不記錄binlog(增量恢復) mysql>set session sql_log_bin = OFF mysql>show variables like ‘%log_bin%’;

    2.8 增量備份

    增量數據是從上次全量備份之后,更新的新數據。對于MySQL來說,binlog日志就是MySQL的增量數據

    (1)按天全備情況

    優點:恢復時間:短,維護成本:低 缺點:占用空間:多,占用系統資源多,經常鎖表影響用戶體驗。

    (2)按周全備情況

    優點:占用空間小,占用系統資源少,無需鎖表,用戶體驗好一些 缺點:維護成本高,恢復麻煩,時間長。

    企業場景全量和增量的頻率是怎么做的呢?

    1)中小公司,全量一般是每天一次,業務流量低谷執行全備,備份時會鎖表。 增量備: a.定時推binlog增量。例如每分鐘推一次增量 例:rsync -avz /data/3306/mysql-bin.0000* rsync_bakcup@10.0.0.1::backup –password-file=/etc/rsync.password b.再在其他遠程實時讀binlog。 -R, –read-from-remote-server? Read binary logs from a MySQL server. c. inotify 實時推送binlog d.mysql主從復制(實時復制功能) 2)大公司周備,每周六00點一次全量,周日-下周六00點前都是增量。 優點:節點備份時間,減少備份壓力。 單臺數據庫用rsync(配合定時任務頻率大或者inotify,主從復制)把所有binlog備份到遠程服務器,盡量做主從復制 缺點:增量的binlog文件副本太多,還原會很麻煩 3)一主多從環境,主從復制本身就是實時遠程備份,可以解決服務器物理故障。 4)一主多從環境,可采取一個從庫服務器上專門用mysqldump,cp、tar、xtrabackup做備份,延遲同步

    MySQL備份常見方法

    MySQL備份的常用方式有邏輯備份和物理備份(oracle也是如此) 邏輯備份:以SQL語句的形式對數據庫進行備份(mysqldump) 物理備份:直接備份磁盤上的數據信息(cp、tar、xtrabackup) 50G一下的數據選擇mysqldump,如果告訴50G 可以使用物理備份,因為那樣邏輯備份會比較慢。 物理備份好于邏輯備份 cp tar 停機(至少禁止寫入),xtrabackup支持熱備

    MySQL的mysqldump備份什么時候排上用場?

    1.遷移或者升級數據庫時。 2.增加從庫的時候。 3.因為硬件或特殊異常情況,主庫或從庫宕機,主從可以互相切換,無需備份 4.認為的DDL,DML語句,主從庫沒辦法了,所有庫都會執行。此時需要備份 5.跨機房災難,需要備份到異地

    2.9 什么情況下需要增量恢復?

    我們在生產工作中一般常用一主多從的數據庫架構,常見的備份方案是在某一個不對外服務的從庫上開啟binlog,然后實施定時全備和實時增量備份 什么是增量恢復? 利用二進制日志和全備進行恢復的過程,被稱為增量備份 1)主或者從庫宕機(硬件損壞)是否需要增量恢復? 答:不需要增量恢復,主庫宕機,只需要把其中一個同步最快的從庫切換為主庫即可。 主庫宕機,只要選擇更新最快的從庫(master.info,或者5.5半同步機制)提升為主庫 從庫宕機,直接不用就好了(一般都會陪LVS負載均衡)或者正常修復 結論:無論是主還是從,硬件損壞導致的故障無需恢復以及增量恢復。 2)人為操作數據庫SQL語句破壞主庫是否需要增量恢復? 在數據庫主庫內部命令行誤操作,會導致所有的數據庫(包括主從庫)數據丟失,例如:在主庫執行了drop database test;這樣的刪除語句,這時所有的從庫也會執行這個drop database test;語句,從而導致所有的數據庫上的oldboy數據丟失。這樣的場景是需要增量恢復的。 結論:認為操作數據庫SQL語句破壞主庫需要增量恢復 3)只有一個主庫是否需要增量恢復? 如果公司里只有一個主庫的情況,首先應該做定時全量備份(一天每天一次)及增量備份(每個1-10分鐘對binlog日志做切割然后備份到其他的服務器上,或者本地其他的硬盤里)或者寫到網絡文件系統(備份服務器)里。 如果不允許數據丟失,最好的辦法就是做從庫,通過drbd(基于磁盤塊的)同步
    正常情況“ 主從同步:除了分擔讀寫分離壓力外,還可以防止物理設備損壞數據丟失的恢復。 從庫備份:在從庫進行全量和增量方式的備份,可以防止認為對主庫的誤操作導致數據丟失。 確保備份的從庫實時和主庫是同步狀態 小結:一般由認為(或程序)邏輯的方式在數據庫執行的SQL語句等誤操作,才需要增量恢復,因為此時所有的從庫夜之星了誤操作語句,物理故障,直接切換從庫即可,無需恢復

    3.0 MySQL增量恢復必備條件

    3.1 開啟MySQL log-bin 日志功能

    Mysql數據庫開啟了log-bin 參數記錄binlog日志功能如下:
  • shell>grep log-bin /data/3306/my.cnf
  • log-bin = /data/3306/mysql-bin
  • 提示:主庫和備份的從庫都要開啟binlog記錄功能 小結:增量恢復的條件: 存在一份全備加上全備之后的時刻到出問題時刻的所有增量binlog文件備份

    3.2 模擬每天00點備份數據,早上10.00領導刪除數據,10.10發現問題并進行解決

    1.修改時間為00:00,進行全備
  • [root@db02 3306]#date -s "00:00:00"
  • [root@db02 3306]# mysqldump -uroot -p123456 -S /data/3306/mysql.sock -B -F -R -x --master-data=2 oldboy|gzip >/opt/rh/oldboy-$(date +%F).sql.gz
  • 2.備份完成修改成10點的時間
  • [root@db02 3306]#date -s "10:00:00"
  • mysql>drop database test;
  • 3.發現問題,并解決 備份后產生了mysql-bin-log,如果不知道可以采用別的方法進行查看 使用gzip查看備份的時候寫入那個binlog里面
  • [root@db02 rh]# gzip -d oldboy-2015-12-22.sql.gz
  • [root@db02 rh]# grep CHANGE oldboy-2015-12-22.sql
  • -- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000007', MASTER_LOG_POS=107;
  • 4.導出數據進行備份,并進行分析
  • [root@db02 rh]# cp /data/3306/mysql-bin.000007 .
  • [root@db02 rh]# ls -l
  • total 8
  • -rw-r----- 1 root root? 792 Dec 22 10:10 mysql-bin.000007
  • -rw-r--r-- 1 root root 3010 Dec 22 00:00 oldboy-2015-12-22.sql
  • 5.以及復制全量備份
  • [root@db02 rh]# mysqlbinlog -d oldboy oldboy-2015-12-22.sql
  • 6.如果恢復的sql文件比較多可以使用模糊匹配 [root@db02 rh]# mysqlbinlog
    -d oldboy oldboy-2015-12-22.sql*或者后面接上bin。? log的文件名(也可以使用for循環)順序一定要正確? ??
  • [root@db02 rh]# mysqlbinlog -d oldboy mysql-bin.000007 >007.sql
  • [root@db02 rh]#vim 007.sql
  • 因為是使用drop刪除,日志里面記錄了,所以我們使用vim將里面的drop刪除
  • 出了問題先把mysql-bin.log拿走,否則直接恢復數據庫會再次記錄
  • [root@db02 rh]# mysql -uroot -p123456 -S /data/3306/mysql.sock? <oldboy-2015-12-22.sql
  • [root@db02 rh]# mysql -uroot -p123456 -S /data/3306/mysql.sock -e "show databases;"
  • +--------------------+
  • | Database?????????? |
  • +--------------------+
  • | information_schema |
  • | cyh??????????????? |
  • | mysql????????????? |
  • | oldboy???????????? |
  • | oldboy123????????? |
  • | oldboy_gbk???????? |
  • | performance_schema |
  • | wordpress????????? |
  • +--------------------+
  • 表示已經恢復到我們00點之前的數據

  • [root@db02 rh]# mysql -uroot -p123456 -S /data/3306/mysql.sock -e "select * from oldboy.test;"
  • +----+--------+
  • | id | name?? |
  • +----+--------+
  • |? 1 | gongli |
  • |? 2 | gongli |
  • |? 3 | gongli |
  • |? 4 | gongli |
  • |? 5 | gongli |
  • +----+--------+
  • 恢復增量數據
  • 恢復增量數據,最好指定數據庫名

    [root@db02 rh]# mysql -uroot -p123456 -S
    /data/3306/mysql.sock ?007.sql

    企業案例:

    625某電商網站數據庫宕機故障解決實錄(上)???

    http://oldboy.blog.51cto.com/2561410/1431161

    http://oldboy.blog.51cto.com/2561410/1431172

    總結

    以上是生活随笔為你收集整理的MySQL备份恢复与日志的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 精品国产乱码久久久人妻 | 一级黄色片国产 | 天天做夜夜爽 | 亚洲精品视频在线看 | 日韩欧美不卡在线 | 殴美一级片 | 欧美三级在线播放 | 国产传媒视频在线 | 国产激情一区二区三区视频免樱桃 | 九九自拍| 免费成人av片 | 超碰在线公开免费 | 狠狠操网址 | 精品人妻无码一区二区三 | 欧洲精品二区 | jizz一区二区三区 | 性视频免费 | 亚洲成年网站 | 美女久久视频 | 日本网站黄色 | 久久久免费网站 | 国产精品卡一卡二 | 日韩一区二区不卡视频 | 国产自精品 | 亚洲精品视频久久久 | 精品人妻一区二区免费 | 动漫av一区| 天堂亚洲网 | 一级做a爰片久久毛片潮喷 天天透天天干 | 噜噜噜久久 | 欧美成人精品欧美一级 | 国产伦精品一区二区三 | 亚洲精品一区久久久久久 | 欧美69av| 先锋影音资源av | 欧美日韩国产综合在线 | 国产91精品高潮白浆喷水 | 好吊色视频一区二区 | 久久中文字幕在线 | 黄色小视频在线播放 | 国产又大又黄又粗 | 亚洲AV无码精品一区二区三区 | 插吧插吧网 | 亚洲熟妇无码av | 双性人妖互交localhost | 色老头免费视频 | 福利视频一区二区三区 | 少妇厨房愉情理伦bd在线观看 | 色婷综合 | 日本三级吃奶头添泬无码苍井空 | 精品欧美一区二区久久久 | 日韩jizz| 亚洲精品少妇 | 成年人免费在线 | 国产美女特级嫩嫩嫩bbb | 超碰导航| caoporn视频在线观看 | 国产成人久久精品 | 国产熟女高潮一区二区三区 | 4hu最新网址| 91青青草视频 | 午夜影音 | jizz处女| 欧美激情一区二区三区在线 | 九色视频91| a毛片网站 | av中文在线天堂 | 国产伦精品一区二区三区四区免费 | 青青草免费观看视频 | 国产无码日韩精品 | 另类专区亚洲 | 在线看黄免费 | 日本一区二区三区久久久久 | 欧美三级手机在线观看 | 9色在线视频 | 不卡一区二区三区四区 | 日韩欧美综合一区 | 亚洲国产免费 | 欧美精品乱码99久久蜜桃 | 狠狠干av| 国产毛毛片 | 日韩国产精品一区 | 三大队在线观看 | 国产成人精品免费网站 | 不卡视频一区 | 熟妇人妻无码xxx视频 | 国产亚洲精品av | 男人天堂成人 | www.欧美激情 | 青青草免费在线观看 | 无码人妻精品一区二区三区99日韩 | 97干干| 亚洲一区二区视频网站 | 亚洲av无码一区二区三区dv | 欧美一区二区在线观看 | 亚洲欧美一区二区三区四区五区 | 国产精品一区二区三区四区在线观看 | 日本三级韩国三级三级a级中文 | 精品自拍偷拍 |