1. 程式人生 > >數據庫(三)

數據庫(三)

MYSQL 備份

忘記數據庫的密碼了。。。(解決方法)
1.網上教程很多,總結下即可
2.一般分為配置文件跳過密碼登陸mysql(此方法要重啟數據庫)和命令行後臺跳過密碼登陸
3.修改完密碼切記刷新授權表
4.刪除配置文件裏的參數(此方法需重啟)或終止後臺命令
5.測試


MVCC


備份的分類
1.備份:數據以隔離的方式保存,恢復速度慢,可以防止人為誤操作
2.冗余:主從,恢復速度快,不能防止人為誤操作
3.異地災備:

備份分為
1.以文件的方式備份,最小單元為文件,備份的時間點難控制(如果要控制時間----停服務),速度快。
2.以sql語句方式備份,最小單元sql語句,備份的時間點較好控制,速度慢。
*(文件備份也稱物理備份,sql語句備份也稱邏輯備份)

3.備份數據量分為:全量備份(對所有數據備份)
增量備份(對於上一次備份的修改的地方備份)
差異備份(對於全量備份的修改的地方備份)

4.備份時服務可用性分為:在線熱備----備份(備份過程服務可用)
離線冷備----備份(備份過程不可用)
溫備 ----備份 (備份過程可讀不可寫)

備份原則
數據一致:時間點,狀態。
服務可用性:讀,寫。

物理備份工具
tar, lvm(快照), percona-xtrabackup
邏輯備份工具
mysqldump

物理備份思路
殺服務,保數據。
1.停服務
2.全備
3.恢復服務
物理備份還原思路
殺服務,清環境
1.停止服務
2.清理環境
3.導數據
4.改權限
5.啟動服務

實驗

 yum install -y mariadb-server  (安裝數據庫)

[root@localhost mysql]# mysqladmin -uroot password 123123  (設置密碼)

tar -czf /tmp/all.tgz /var/lib/mysql/  (打包數據)

 [root@localhost mysql]# mysql -uroot -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 3
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)

MariaDB [(none)]> drop database test;(誤操作將庫刪除)
Query OK, 1 row affected (0.00 sec)

[root@localhost mysql]# systemctl stop mariadb (停服務)

[root@localhost mysql]# rm -rf /var/lib/mysql/ (清環境)
[root@localhost mysql]# 

[root@localhost mysql]# tar -xf /tmp/all.tgz -C /(導數據)
[root@localhost mysql]# 

[root@localhost mysql]# systemctl start mariadb(啟動服務---這裏要是起不來服務先kill掉mysql相關進程)

[root@localhost mysql]# mysql -uroot -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |               (數據回來了)
+--------------------+
4 rows in set (0.01 sec)

MariaDB [(none)]> 

*(這種方法有缺點,總不能時時刻刻都打包吧,解決方法)

邏輯備份:mysqldump
myisam 該存儲引擎要保證數據完整,服務不一定可用(可用的情況---加全局讀鎖),時間點mysqldump開始的時候
innodb 服務可用,基於mvcc版本控制,時間點mysqldump開始的時候

1.控制服務狀態
myisam --lock-all-tables
innodb --single-transaction

2.備份對象
所有庫:-A 單庫 庫名 多個庫 -B

mysqldump -u用戶 -p密碼 備份對象 控制服務狀態 >備份路徑

 MariaDB [test]> create table list(id int) engine=myisam; (指定表類型為myisam)
Query OK, 0 rows affected (0.00 sec)

MariaDB [test]> show table status\G;    (查看表屬性)
*************************** 1. row ***************************
           Name: list
         Engine: MyISAM
        Version: 10
     Row_format: Fixed
           Rows: 0
 Avg_row_length: 0
    Data_length: 0
Max_data_length: 1970324836974591
   Index_length: 1024
      Data_free: 0
 Auto_increment: NULL
    Create_time: 2018-05-20 15:04:29
    Update_time: 2018-05-20 15:04:29
     Check_time: NULL
      Collation: latin1_swedish_ci
       Checksum: NULL
 Create_options: 
        Comment: 
*************************** 2. row ***************************
           Name: test1
         Engine: InnoDB
        Version: 10
     Row_format: Compact
           Rows: 2
 Avg_row_length: 8192
    Data_length: 16384
Max_data_length: 0
   Index_length: 0
      Data_free: 10485760
 Auto_increment: NULL
    Create_time: 2018-05-20 14:38:32
    Update_time: NULL
     Check_time: NULL
      Collation: latin1_swedish_ci
       Checksum: NULL
 Create_options: 
        Comment: 
2 rows in set (0.00 sec)

ERROR: No query specified

MariaDB [test]> insert into list values (1);(插入一條數據)
Query OK, 1 row affected (0.00 sec)

MariaDB [test]> Bye
[root@localhost mysql]# mysqldump -uroot -p123123 test --lock-all-tables > /tmp/test.sql  (加讀鎖備份)
[root@localhost mysql]# mysql -uroot -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.

MariaDB [(none)]> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [test]> select * from list;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

MariaDB [test]> delete from list where id=1  (誤操作)
    -> ;
Query OK, 1 row affected (0.00 sec)

MariaDB [test]> Bye
[root@localhost mysql]# mysql -uroot -p123123 test < /tmp/test.sql   (導入數據)
[root@localhost mysql]# mysql -uroot -p
Enter password: 
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 6
Server version: 5.5.56-MariaDB MariaDB Server

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.

MariaDB [(none)]> use test;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MariaDB [test]> select * from list;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.01 sec)  ()
*(多個庫與單庫操作一樣)

*(對整個庫采取全局讀鎖的方式備份,但是在恢復數據時,要手動刪除之前的庫)

全庫的思路
1.停服務
2.清環境
3.啟動服務
4.導數據
5.刷新授權表
6.測試

實時備份
常規日誌: /var/log/mariadb/mariadb.log  默認開
二進制日誌 binlog DDL DCL DML    默認不開
慢查詢日誌: slowlog
查詢日誌: DQL

二進制日誌(實時增量備份)

[root@localhost binlog]# vim /etc/my.cnf
[mysqld]
log-bin=/var/lib/binlog/logbin (開啟二進制日誌)

[root@localhost binlog]# mkdir /var/lib/binlog(創建目錄)

[root@localhost binlog]# chown mysql. /var/lib/binlog/(加權限)

[root@localhost binlog]# systemctl restart mariadb(啟動服務)

[root@localhost binlog]# ls
logbin.000001  logbin.index(自動生成)

[root@localhost binlog]# file logbin.000001 
logbin.000001: MySQL replication log (二進制日誌不能直接使用vim編輯或者cat查看)

[root@localhost binlog]# mysqlbinlog logbin.000001 (使用mysqlbinlog查看)
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#180520 16:22:23 server id 1  end_log_pos 245   Start: binlog v 4, server v 5.5.56-MariaDB created 180520 16:22:23 at startup
# Warning: this binlog is either in use or was not closed properly.
ROLLBACK/*!*/;
BINLOG ‘
PzABWw8BAAAA8QAAAPUAAAABAAQANS41LjU2LU1hcmlhREIAbG9nAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAA/MAFbEzgNAAgAEgAEBAQEEgAA2QAEGggAAAAICAgCAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAANRcIYA==
‘/*!*/;
DELIMITER ;
# End of log file
ROLLBACK /* added by mysqlbinlog */;
/*!50003 SET COMPLETION_TYPE=@OLD_COMPLETION_TYPE*/;
/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=0*/;

[root@localhost binlog]# mysqlbinlog logbin.000001 |grep create -B 10  (-B 是之前 -A 是之後)

/*!50530 SET @@SESSION.PSEUDO_SLAVE_MODE=1*/;
/*!40019 SET @@session.max_insert_delayed_threads=0*/;
/*!50003 SET @OLD_COMPLETION_TYPE=@@COMPLETION_TYPE,COMPLETION_TYPE=0*/;
DELIMITER /*!*/;
# at 4
#180520 16:22:23 server id 1  end_log_pos 245   Start: binlog v 4, server v 5.5.56-MariaDB created 180520 16:22:23 at startup

mysqlbinlog --help(可以基於時間點恢復,參數幫助裏有) 定位文件 | mysql -u用戶 -p密碼         (恢復操作)

*(時間左閉右開)(問題又來了,如果兩個人同時操作怎麽基於時間恢復?解決方法----基於位置恢復)

[root@localhost binlog]# mysql -e "flush logs" -uroot -p123123(手動刷新日誌)
[root@localhost binlog]# ls
logbin.000001  logbin.000002  logbin.index

DELIMITER /*!*/;
# at 4  (這個是位置標記----左閉右開)

數據寫入量大的時候不可能自己去一個個找---解決方法

[root@localhost binlog]# mysqldump -uroot -p123123 test --flush-logs --single-transaction --master-data=2 > /tmp/master.sql

--master-data=2(可以指定好日誌位置,下恢復操作直接從這裏開始即可)

-- CHANGE MASTER TO MASTER_LOG_FILE=‘logbin.000005‘, MASTER_LOG_POS=245;(這裏245就是指定出來的位置)

備份myisam
1.鎖表
2.備份數據
文件
            list.frm 表結構
            list.MYD 表數據  myisam data
            list.MYI  表索引  myisam index
3.獲取二進制日誌位置
4.解鎖表

備份innodb
存儲結構
文件
庫  /list.frm   表結構
/var/lib/mysql/ibdata1  表空間  存放所有數據
ib_logfile0 事務日誌
ib_logfile1 

事務日誌:begin事物開始就記錄   如有故障,進行回滾
二進制日誌:commit之後的刪寫操作   實時備份

xtrabackup  全量備份
基於事物日誌做備份
增量備份的手段和二進制日誌的標記號類似

xtrabackup  全量備份
實驗
[percona-xtrabackup下載地址] (https://www.percona.com/downloads/XtraBackup/LATEST/)

[root@localhost xtraba]# ls
percona-xtrabackup-24-2.4.11-1.el7.x86_64.rpm            percona-xtrabackup-test-24-2.4.11-1.el7.x86_64.rpm
percona-xtrabackup-24-debuginfo-2.4.11-1.el7.x86_64.rpm

yum localinstall -y * (安裝)

mkdir ~/mybackup(創建目錄)

innobackupex --user=root --password=123123 /root/mybackup/ (備份文件)

MariaDB [(none)]> drop database test;(誤操作)

 systemctl stop mariadb (停服務)

 rm -rf /var/lib/mysql/(清環境)

innobackupex --apply-log /root/mybackup/2018-05-20_18-10-44/(回滾並重演)

innobackupex --copy-back /root/mybackup/2018-05-20_18-10-44/ (寫入數據)

 chown mysql. -R /var/lib/mysql/(修改權限)

systemctl start mariadb(啟動服務)

mysql -uroot -p(驗證)

xtrabackup增量備份
實驗
1.進入數據庫
2.
   insert into list values (100);
     begin;
     insert into list values (200);

3.  2018-05-20 18:45:26 innobackupex --user=root --password=123123 --incremental-basedir=/root/mybackup/2018-05-20_18-10-44/ --incremental /root/mybackup/     (增備)
4.  進入數據庫
5.  commit;
     begin;
         insert into list values (300);

6. innobackupex --user=root --password=123123 --incremental-basedir=/root/mybackup/2018-05-20_18-45-26/ --incremental /root/mybackup/  (增備)

7. 
847  2018-05-20 18:57:53 innobackupex --user=root --password=123123 --apply-log --redo-only /root/mybackup/2018-05-20_18-10-44/    (重演不回滾)

8. 
 848  2018-05-20 18:57:53 innobackupex --user=root --password=123123 --apply-log --redo-only /root/mybackup/2018-05-20_18-10-44/ --incremental-dir=/root/mybackup/2018-05-20_18-45-26/  (第一次增備數據合並全量備份)

8.  
  849  2018-05-20 19:00:15 innobackupex --user=root --password=123123 --apply-log --redo-only /root/mybackup/2018-05-20_18-10-44/ --incremental-dir=/root/mybackup/2018-05-20_18-48-28/(第二次增備數據合並全量備份)

9. 
854  2018-05-20 19:01:13 innobackupex --apply-log /root/mybackup/2018-05-20_18-10-44/(回滾並重演)
[root@localhost mysql]# systemctl stop mariadb (停服務)

10.
  855  2018-05-20 19:01:43 rm -rf /var/lib/mysql/  (清環境)
  856  2018-05-20 19:02:03 innobackupex --copy-back /root/mybackup/2018-05-20_18-10-44/(寫入數據)
  857  2018-05-20 19:02:26 chown mysql. -R /var/lib/mysql/(給權限)
  866  2018-05-20 19:04:43 systemctl start mariadb(啟動服務)

這裏300這條數據應該是進不來的,但是我的進來了,我的表存儲結構myisam,不知道咋回事。。。。

下午沒寫完,在家裏用6.5的系統寫完,有些不一樣的地方還請包涵

一開虛擬機就報錯了。。。
Linux啟動提示“unexpected inconsistency;RUN fsck MANUALLY”
解決方法:

fsck不僅可以對文件系統進行掃描,還能修正文件系統的一些問題,值得註意的是fsck掃描文件系統時一定要在單用戶模式、修復模式或把設備umount後進行!!!

  首先進行單用戶模式或直接在那裏輸入root密碼進入修復模式(單用戶有的也進不去)

  再用命令fsck修復所提示出錯的分區或磁盤:
#fsck.ext4 -y /dev/sda2    ——>出錯所在分區或磁盤
  註:請選擇你的文件系統格式類似(ext2?ext3?ext4?),-y 選項指定檢測每個文件是自動輸入yes,修復過程也有可能損壞系統文件!
修復ok,reboot下。

[root@CDN ~]# mysqladmin -uroot password 123
mysqladmin:
You cannot use ‘password‘ command as mysqld runs
 with grant tables disabled (was started with --skip-grant-tables).
Use: "mysqladmin flush-privileges password ‘*‘" instead
(這裏你的密碼已經設置好了,看這個信息應該是提示)

centos6.5下載percona-xtrabackup

[root@CDN opt]# rpm -ivh percona-xtrabackup-24-2.4.11-1.el6.x86_64.rpm
warning: percona-xtrabackup-24-2.4.11-1.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY
error: Failed dependencies:(缺少依賴關系包--解決方法)

1.wget http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

2.yum install epel-release-6-8.noarch.rpm

3.yum install libev(如果還是下載不了--解決方法)
 vim /etc/yum.repos.d/epel.repo
   [epel]
name=Extra Packages for Enterprise Linux 6 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch
mirrorlist=http://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=$basearch(添加上這條)

技術分享圖片

[root@CDN bin]# innobackupex --user=root --password=123 /root/mybackup (有報錯,耐心。。)
180520 08:20:50 innobackupex: Starting the backup operation

IMPORTANT: Please check that the backup run completes successfully.
           At the end of a successful backup run innobackupex
           prints "completed OK!".

180520 08:20:50  version_check Connecting to MySQL server with DSN ‘dbi:mysql:;mysql_read_default_group=xtrabackup‘ as ‘root‘  (using password: YES).
180520 08:20:50  version_check Connected to MySQL server
180520 08:20:50  version_check Executing a version check against the server...
180520 08:20:50  version_check Done.
180520 08:20:50 Connecting to MySQL server host: localhost, user: root, password: set, port: not set, socket: not set
Error: Built-in InnoDB in MySQL 5.1 is not supported in this release. You can either use Percona XtraBackup 2.0, or upgrade to InnoDB plugin.(查看翻譯後,好像是版本不支持,還有一點可以升級innodb插件)

升級innodb插件
1.[root@CDN bin]# vim /etc/my.cnf
   [mysqld]
ignore-builtin-innodb
plugin-load=innodb=ha_innodb_plugin.so

2.重啟mysqld
3.ok

備份固然是好的,但是恢復速度實在是慢(解決方法---冗余)
備份和冗余相輔相成

下次分享下冗余。。。

數據庫(三)