linux下mysql備份數據入門

一、MySQL介紹:

MySQL爲C/S模型

#併發型 大多數遇到的服務
>主進程派生子進程進行處理

#重複型 如TFTP
*啓動進程(端口)
*發送請求
*處理請求
*同時第二個客戶發送請求時出現問題
使用主進程進行處理
>主進程派生子進程進行處理

taobao 遷移出 IOE
Mysql5.6 新版本 功能有所減少
Mysql5.5

MySQL特性:
1.存在依賴關係的表
2.可以在多種操作系統上運行

                          |————client 與mysql出自同一處
mysql<-SQL<-|————php
                          |————perl
                          |————python

存儲引擎:數據庫讀寫文件的方式
MyISAM爲mysql的存儲引擎
讀多寫少,讀較快,內存消耗打,併發量上不來,不支持回滾
可用innodb存儲引擎

二、安裝mysql
yum -y install mysql-server mysql mysql-connector-odbc
port:3306
/var/lib/mysql/
/etc/my.cnf
service mysqld restart//在其他平臺環境下,在啓動服務之前要先初始化數據庫,REDHAT下已經包含
/usr/bin/mysqladmin -u root password 'new-password' //設定密碼,初始化
/usr/bin/mysqladmin -u root password 'new-password' -p //後續修改密碼,需要原始密碼

mysql -uroot -p //登錄

三、基本命令
#mysql
>show databases;

information_schema //tmple file
mysql //root
test //anyone
這幾個庫不用

>create database db1;

#mysqladmin create db2 //有密碼的話加 -p

#mysqlbinlog //讀取用二進制方式記錄的日誌文件

#mysqlcheck //檢查、修復、分析以及優化表的表維護客戶程序。不用!

#mysqldump //10G以下可以使用其備份,並且跨版本的。重要

#mysqlimport //不用,試用其他方法恢復數據。

四、庫,表的基本操作與授權
> create database bookshop;
> use bookshop;
> drop database bookshop;

> create table reserve(
-> id int primary key,
-> bookname text,
-> writer text,
-> bookdate date not null,
-> price float,
-> amount int
-> );
> show tables;
> desc reserve;//查看錶結構
#ls .mysql_history
> insert into reserve (id,bookname,writer,bookdate,price,amount) values(1,"linux","linus","2001-01-01",100,50),(2,"web-apache","aparch.og","2010-01-01",50,50),(3,"web-nginx","nginx.org","2010-01-01",50,50);
> select * from reserve;
> select bookname,amount from reserve; //只查詢指定列
> select bookname,amount from reserve where id=1;
> select * from reserve where bookname like "web%";
...

索引:快速查找數據,有用到二叉樹,暫不詳講。
使用grant語句添加用戶名授權
1.授權192.168.0網段的可以以用戶user2,密碼redhat1的身份訪問192.168.0.112這臺主機下的bookshop數據庫
> grant all privileges on bookshop.* to 'user2'@'192.168.0.%' identified by 'redhat1';
2.授權192.168.0.143的主機可以以用戶user2,密碼redhat2的身份訪問192.168.0.112這臺主機下的bookshop數據庫
> grant all privileges on bookshop.* to 'user2'@'192.168.0.143' identified by 'redhat2' with grant option; //這裏的with grant option 表示143這個主機還可有再授權給別人,沒有就只能他自己能訪問bookshop數據庫。
注:如果1跟2條都做了的話,第2條生效。
3.修改用戶密碼
> grant usage on bookshop.* to [email protected] identified by '123456';
4.在賦予權限之後,要執行下flush privileges命令刷新權限緩存來讓你的設置立即生效。> flush privileges;
5.找回root密碼
#service mysqld stop //先停掉mysql服務
#mysqld_safe --skip-grant-tables &//後臺 重新啓動mysql,不過這個會使任何人都可以訪問mysql服務器,故請斷掉網絡連接來操作。
#mysql
> use mysql;
> update user set password=password('new_pass') where user="root" and host=localhost;//select * from user\G;//\G表示格式化下,更好地查看user表
> exit
# service mysqld restart
//修改密碼成功了爲new_pass
五、備份
mysqldump 可以跨版本,可以備份某些庫,也可以備份所有的庫。

mysqldump --database bookshop
mysqldump bookshop //備份bookshop庫中所有表
mysqldump --all-databases -uroot -predhat > /tmp/mysql.all.sql
//查看備份文件,爲sql腳本文件

mysql < /tmp/mysql.all.sql //將sql腳本文件導入,恢復數據
mysqladmin flush-privileges // 使用戶密碼生效

2個衝突問題:
1.服務可用性; 假設1點到5點備份中服務可用的,會造成數據的一致性問題
2.數據的一致性;鎖表,則一些寫服務就延遲了。
根據實際生產環境均衡。

*假設保證數據一致性:在備份時加入參數 --lock-all-tables,整個過程中表只可讀不可寫。
mysqldump --all-databases -uroot -predhat --lock-all-tables > /tmp/mysql.all.sql

*二進制日誌的使用

vi /etc/my.cnf
在[mysqld]中加入 log-bin=mylog
/etc/init.d/mysqld restart
//這樣如果改動就會記錄到這個裏面去
ls /var/lib/mysql/
會出現的日誌爲mylog.00001,還多了個mylog.index文件
mysqlbinlog mylog.00001 | mysql 恢復改動數據
以後可以通過下面命令做完整備份
mysqldump --all-databases -uroot -predhat --lock-all-tables --flush-logs > /tmp/mysql.all.sql

//當你加入--flush-logs參數將會新增mylog.xxx的文件,service mysqld restart也會新增mylog.xxx 來記錄數據庫的改動


==============

更新:今天又學了新的東西哦,主要三部分,以====分割線分割了,第一部分接上面的,

關於如何跳過誤操作進行重演日誌;第二部分爲搭建單向主從數據庫以及雙向

主從服務器;第三部分爲邏輯卷snapshot備份。


1.假設3點做的完全備份,3點到10點間有10,11,12 3條插入記錄;之後在10點做了個delete
的誤操作,前面3條都刪掉了,又插入了13,14 2條記錄;我們在12
點發現這個問題,要如何恢復數據庫呢。
停止服務,清空環境,日誌不能清掉!;#for i in `ls | grep ^mylog -v`;do rm -rf /var/lib/mysql/$i;done
導入完全備份;
不能重演全部,要跳過delete操作;
查看log中的時間,時間是用來分隔操作的,重演delete上面的和下面的操作命令,可通過
時間指定;
#mysqlbinlog mylog.000014 | grep ^delete -C 3 //查找delete前後的時間
#mysqlbinlog mylog.000014 --stop-date="2013-05-17 10:21:50" | mysql
#mysqlbinlog mylog.000014 --start-date="2013-05-17 10:22:00" | mysql
//可以先不管道到mysql,先回車查看重演是否正確。


2.假設10點insert 15,16;delete15,16(誤刪除);insert17,18;都在同一時刻的操作。
問題復原(創造同一時間點的5個操作):
vim /tmp/sql1

use db1;
insert into t1 (id) values (15);
insert into t1 (id) values (16);
delete from t1;
insert into t1 (id) values (17);
insert into t1 (id) values (18);

mysql < /tmp/sql1
恢復:
導入完全備份;
重演:
方法一,
#mysqlbinlog mylog.000014 | grep ^delete -C 3 //查找delete前後的時間,發現前後時間點都一樣
//不能通過時間點恢復,可以通過position號進行重演
#mysqlbinlog mylog.000014 --stop-position="292" | mysql
#mysqlbinlog mylog.000014 --start-position="368" | mysql
方法二,
#mysqlbinlog mylog.000014 > /tmp/sql1.log
#vi /tmp/sql1.log //刪除掉delete那一行,再將該文件導入到數據庫去


===================
MYSQL的AB複製:
主從服務器只能解決硬件故障
從庫不提供服務,當主服務器出現問題時,可以指向從服務器進行數據的查詢。當主服務器有變化時,
從服務器做數據同步。
*雙方初始化一致
*主服務器開啓日誌
*從服務器讀取主日誌
*從服務器自動重演日誌

假設master的ip地址爲192.168.0.102,slave 的ip地址爲192.168.0.112

---單向主從---

master端:
先停服務,清空環境,還原配置,在開啓服務
開啓日誌,修改server-id,重啓服務
mysqldump --flush-logs//備份
scp 給slave
授權給從服務器 grant replication slave on *.* to slave@'192.168.0.112'  //從ip地址
刷新授權表 flush privileges;


slave端:
修改server-id
初始化並導入備份 mysql< 
mysql> change master to master_host='192.168.0.13',master_user='',master_password='',
master_log_file="xx.000001",master_log_pos=106;
mysql> slave start; //在此之前一定要保證2邊數據一致
mysql> show slave status\G;
//查看Slave_IO_Running Slave_SQL_Running
從服務器的日誌是從下一個日誌備份的


---雙向主從---
雙master環境下的問題:網絡延遲會造成2個寫操作分別到達主/輔服務器中,會有衝突出現。主從斷開。
搭建雙master,使slave也能同步自己的數據給master,授權語句仍然需要做master上做!

master下:
grant replication slave on *.* to slave@'192.168.0.102'         //主ip地址


flush previleges


change master to master_host='192.168.0.112',master_user='',master_password='',   //從ip地址
master_log_file="xx.000001",master_log_pos=106;


slave:
開啓日誌
重啓服務後要查看下主輔同步還在否,不在就slave start
添加授權//在server端操作,因爲要保證user表一致性
show master status; //查詢自己的log號告訴對方


==================


使用LVM快照方式進行備份
之前我們講到
1.數據一致性
2.服務可用性
要想解決上述兼得問題,可以使用以下2個方案:
1)master提供服務,slave提供備份
2)lvm snapshot 如果要備份就讀snapshot,服務仍然讀mysql


缺點:
需要你的系統支持快照
使用快照需要系統root權限
有進程在寫造成snapshot延遲
/var/lib/mysql


lvcreate -s -L 1G -n snap0 /dev/vg0/lv0 
//快照大小最好不要超過lv大小,系統本身限制,大了會認識不出來。
ls /dev/vg0/snap0
mount /dev/vg0/snap0 /var/snap/


1.數據遷移(因爲快照要做邏輯捲上做,而本來的數據庫是在物理捲上的,故要遷移)
假設/var/lib/mysql上的數據在物理設備上/dev/sda3 上的,那麼就需要額外創建lv來做快照備份
創建lv,比如/dev/vg0/lv0
service mysqld stop  //將mysql服務停止
cd /var/lib/mysql/   //這邊記得查看下content值,方便解決下面selinux問題
tar cf - . | tar xif - -C /var/lv/     //要使用相對路徑 備份/var/lib/mysql下的數據
ls /var/lv/
掛載:
mount /dev/vg0/lv0 /var/lib/mysql/    //將lv掛載爲mysql數據目錄,此時內容爲空,相當於清空環境了
tail /var/log/mysql.log //mysql的啓動日誌
權限三部分:服務內部,selinux,普通權限
sealert -a /var/log/audit.log //記錄了selinux的報錯信息
此處要遞歸修改/var/lib/mysql的context值,restore

2.數據備份(不停止服務)
需要查看日誌點來重演
#/etc/init.d/mysqld start
#mysql
mysql> flush tables with read lock; //先鎖表,使寫延遲
mysql> show master status; //查看position號,比如log12的457位置
lv create -s -L 1G -n snap0 /dev/vg0/lv0 //做快照,snapshot 跟修改的大小有關
unlock tables;//解鎖
mount /dev/vg0/snap0 /var/snap
cd /var/snap
用tar指令備份snapshot //日誌和數據庫不要備份在一起!備份 目錄(即數據庫)和ib_log*
umount snap/
lvremove /dev/vg0/snap0

3數據恢復還原:
假設數據庫損壞,則先/etc/init.d/mysqld stop
清空/var/lib/mysql下的環境
將步驟2中備份數據snapshot解壓縮到/var/lib/mysql下,再重演log12的457位置後東西

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章