欢迎各位兄弟 发布技术文章
这里的技术是共享的
镜像
MySQL的备份和还原
备份:副本
RAID1,RAID10:保证硬件坏而不会业务中止;
drop table mydb.tb1;
备份和raid是两个不同层次上的概念
假设50G
cp (把服务器停了,把内存中的缓存同步到磁盘,再cp;;;但是服务器停了的话,代价太大了吧)
备份类型:
(根据备份的时候服务器是否能够在线)
热备份:在线备份,读,写操作可继续进行,不受影响
温备份:仅可以执行读操作,
冷备份:离线备份,,,读写操作均中止(均不能进行)
(根据是直接拷贝数据文件还是将数据导出)
物理备份: 直接复制数据文件
逻辑备份: 将数据导出至文本文件中,必要时再还原回去
热备份,温备份,冷备份均可以进行物理备份,逻辑备份
(根据备份是否包含了全部数据内容)
完全备份:备份全部数据(可能某个库,可能所有库)
增量备份: 仅备份上次完全备份或增量备份以后变化的数据
差异备份: 仅备份上次完全备份以来变化的数据.....差异备份与增量备份通常只需要提供一种就可以,并非每一种都同时提供
差异备份比增量备份多占空间,但是还原起来简单
备份策略是 完全+增量 或 完全+差异
可以物理 或 逻辑 方式 进行 完全备份,增量备份
可以进行在线:物理完全备份
备份的目的是为了还原,要进行测试是否能还原
备份很轻松,还原很紧张
还原过程有错没事,还原源文件有错,问题就大了
要有好的备份及还原策略以及紧急情况下还原的处理方案
备份什么:
数据,配置文件,二进制日志,事务日志
(如果在mysql服务器上的操作系统级别提供了额外的其它配置信息(如 sudo ),任何与 mysql 配置相关的配置文件及其它定义都要备份)
物理方式备份就是复制数据文件
离线备份数据最安全,但热备份业务不会中止
热备份:
热备份所需要的技术复杂度最高
MyISAM存储引擎,热备份几乎是不可能的
InnoDB可以热备份,无论是逻辑备份还是物理备份,它都不影响当前事务
在源服务器上进行备份,源服务器正在工作,还要处理备份请求,势必影响Mysql服务器的性能(无论是MyISAM或InnoDB)
热备份
MyISAM:
几乎热备(接近于热备份的方式) LV,借助于逻辑卷(使用快照进行备份),,,,否则MyISAM最好使用温备份(以共享方式锁定MyISAM中的所有表)(这样别人就不能改了,复制一份数据就可以了)
InnoDB:
可以使用一些工具进行热备份,
比如 perkona提供的 xtrabackup(它是物理备份,热备份)
mysql自己提供的 mysqldump(它是逻辑备份,热备份) 性能要差一点
离线备份
MySQL--> 从服务器: (需要备份的时候,停下从服务器,进行备份,备份好后,再启动,它会继续从主服务器那边同步)
所以从服务器需实时在线,需要浪费一台服务器在工作着
实际生产环境中,停下一台从服务器是可以的,,,,,,但是我们只要把从进程(从主服务器获取数据的进程)停掉->它本来是只读的,这时可以进行温备份,所以不一定非得离线
物理备份:速度快,,直接复制文件,,不需要借助于mysql服务器自身作任何处理,,,直接复制数据文件,如果数据文件本身与文件系统没有关系,那它的跨平台能力很强,一致性也很强,,,但是有些存储引擎的数据文件与有些文件系统有关系,会导致移植能力不强,
由于是直接复制数据文件的,直接还原数据文件就可以了,保留了数据文件中的所有数据结构
逻辑备份:速度慢,, 是将文件导出的,整个过程需要mysql进程参与的,另存为文件文件,因此速度慢
可能会丢失浮点数精度的,因为要将数据转换成文本字符,,,
可以方便使用文本工具对导出的文本文件作二次处理(比如sed命令删除某些行)
可移植性强:可以导入任何一个数据库,甚至可以跨mysql服务器的版本
备案策略:完全+增量 或 完全+差异
如果数据变化量不大,每天变化不频繁,能忍受一定时间的还原时间长度(还原时所需要的时间长度很重要), 增量还原时间长,麻烦大,要一天天的堆起来,
可以:一周做一次完全,每天做一次增量或差异
一个月做一次完全,每天做一次增量或差异
一天做一次完全,每小时做一次增量或差异
完全备份 可以任意使用物理备份或逻辑备份
增量备份 可以任意使用物理备份或逻辑备份
甚至完全备份可以与增量备份不相同(一个使用物理备份,另一个使用逻辑备份)
Mysql备份工具:
mysqldump 逻辑备份工具 可以实现冷备份,一般对MyISAM可以实现温备 一般对InnoDB可以实现热备
mysqlhotcopy 物理备份工具 名称上热备份工具 (它锁表了,事实上是温备份工具,几乎是冷备份工具)
文件系统工具:
cp命令:冷备(复制的时候,时间点上肯定不一致) (物理备份)
lv:逻辑卷的快照功能(因为瞬间完成),几乎热备: (物理备份)
MyISAM
1) mysql> lock tables;
2) mysql> flush tables; (flush tables 就相当于日志文件经过内存往数据文件同步,,难道是清空这个内存的这个过程?)
3) 创建快照,释放锁,复制数据即可
lock tables;flush tables; 后,所有的内容都已经从内存写到磁盘上去了
InnoDB
lock tables; flush tables; 后,背后还可能有写操作,因为可能有些事务在日志当中,它正在日志文件中往数据文件中同步
已经提交的事务,可能在内存当中,从内存中往日志文件中提交
还要看着监督着InnoDB的存储引擎,确保它的缓冲区中的内容都已经同步到磁盘上才行,这可能需要大量的时间
第三组工具:
ibbackup: (innodb使用的,商业工具,很贵,一个服务器授权5000刀)(物理备份)(备份Innodb可以热备)(备份MyISAM,只能以温备的方式进行)
xtrabackup: 开源工具,比ibbackup功能更强 (与 ibbackup 类似)
基于网络的专业级别的备份工具:
bakura (不仅仅mysql,其它文件系统中的数据也能备份)
zmenda (专门的可用于mysql备份的工具,开源版(GPL版本)(开源版够绝大多数场景使用),商业版) (从一个或多个服务器备份到一个集中的服务器上,比较好用)
[root@mail ~]# man mysqldump # 它是逻辑备份
mysqldump - a database backup program
[root@mail ~]# man mysqlhotcopy #它是物理备份
mysqlhotcopy - a database backup program
mysqldump: 逻辑备份
mysqldump(完全备份)+二进制备份
完全+增量: (完全+差异)
mysqldump备份整个数据库(完全)+每天备份一次二进制日志(增量)
mysqldump选项用法
它是个客户端工具,所以能够使用 -u -p 等选项
db_name:备份指定数据库 [tb1] [tb2] 表示只备份某张表
如果使用这种方式只备份一个数据库,它并不包含创建这个数据库的命令,将来还原时,要手动创建这个数据库
备份单个数据库,或库中特定表
mysqldump DB_NAME [tb1] [tb2]
--master-data=n (n 是 0 ,1 ,2 三个值)
0表示不记录二进制日志文件及其事件位置
1表示记录以 change master to 的方式记录位置,可用于恢复后直接启动从服务器
2表示记录以 change master to 的方式记录位置,但是默认被注释掉
--lock-all-tables 锁定所有表 (锁定所有库的表???不懂?) (我总感觉这个选项 包含了 flush tables)
--lock-tables (如果只备份一张表,可以锁定一个表)只锁定一张表(其实不建议这么用) (可以手动锁定某个库的某张表)(备份多张表时,最好使用 --lock-all-tables )
--flush-logs 可以自动执行日志滚动的
--single-transaction 如果指定库中的表类型均为InnoDB,可使用 启动热备份,既然启动热备份了,就不要使用 --lock-all-tables 这样的温备份了,它会自动使用锁的施加等操作的 ,,,,--single-transaction 可能会启用一个非常长的事务,可能备份过程需要很长时间(尤其是非常繁忙的在线的服务器上,)
备份多个库, 会自动执行create database 命令,还原时就不用手动指定库了
--all-databases:备份所有库,
--databases DB_NAME,DB_NAME....:备份指定库 # --databases 也可以指定一个库,
下面几个选项,了解就行
--events 备份事件的(事件调度器)
--routines 例程:备份存储过程和存储函数的
--triggers 备份触发器的
[root@mail ~]# mysqldump -uroot -p jiaowu > /root/jiaowu.sql #备份教务数据库
#必须要mysql服务器在线,它要导出,是要通过 mysql 服务器通信的
#如果有人正在往数据库写数据的话,会带来时间点的不一致,真正备份时,应该锁表
#在这一行命令执行前,应该先 mysql> lock tables ; mysql> flush tables;
或者 mysql> flush tables with read lock; (刷新表并以读的方式锁定)
#备份后要赶紧释放掉锁
#如下图,,,锁表后,已经不能写数据了 (下图是截图马哥操作的,我也执行了一遍)
Enter password:
[root@mail ~]#
[root@mail ~]# pwd
/root
[root@mail ~]# vim jiaowu.sql
mysql> drop database jiaowu; #删了 jiaowu 数据库
Query OK, 4 rows affected (0.05 sec)
mysql>
[root@mail ~]# mysql < jiaowu.sql # 导入 sql语句 报错,没有数据库
ERROR 1046 (3D000) at line 22: No database selected
[root@mail ~]#
mysql> create database studb; #建一个数据库(另一个名称的数据库)
Query OK, 1 row affected (0.02 sec)
mysql>
[root@mail ~]# mysql studb < jiaowu.sql # 导入 备份的sql文件 到数据库(另一个名称的数据库)
[root@mail ~]#
先刷新表(并以读的方式锁定)
mysql> flush tables with read lock;
Query OK, 0 rows affected (0.01 sec)
mysql>
[root@mail ~]# mysqldump -uroot -p studb > /root/studb.sql;
Enter password:
[root@mail ~]#
备份后 立刻释放锁
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
mysql>
锁表后
mysql> insert into tutors (tname) values ('hellodb'); #停在这里不动了
释放锁后,,这里成功执行了
Query OK, 1 row affected (0.01 sec)
mysql>
我们执行下面的操作
mysql> flush tables with read lock; #锁表
Query OK, 0 rows affected (0.00 sec)
mysql> flush logs; #滚动日志,产生新的日志文件
Query OK, 0 rows affected (0.05 sec)
mysql> show binary logs; ( # show master logs ) #最后一个是从这个时间点的新日志
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000012 | 1038693 |
| mysql-bin.000013 | 26239 |
| mysql-bin.000014 | 1038693 |
| mysql-bin.000015 | 126 |
| mysql-bin.000016 | 126 |
| mysql-bin.000017 | 126 |
| mysql-bin.000018 | 126 |
| mysql-bin.000019 | 999 |
| mysql-bin.000020 | 883 |
| mysql-bin.000021 | 14046 |
| mysql-bin.000022 | 2849 |
| mysql-bin.000023 | 390 |
| mysql-bin.000024 | 729 |
| mysql-bin.000025 | 126 |
| mysql-bin.000026 | 150 |
| mysql-bin.000027 | 196 |
| mysql-bin.000028 | 107 |
| mysql-bin.000029 | 5289 |
| mysql-bin.000030 | 107 |
+------------------+-----------+
19 rows in set (0.00 sec)
mysql>
难道每次都要记录下来,,新产生的二进制日志的位置?
此时不锁表了
[root@mail ~]# mysqldump -uroot -p studb > /root/studb-`date +%F-%H-%M-%s`.sql
Enter password:
[root@mail ~]#
[root@mail ~]# mysqldump -uroot -p --master-data=2 studb > /root/studb-`date +%F-%H-%M-%s`.sql
Enter password:
[root@mail ~]#
[root@mail ~]# pwd
/root
[root@mail ~]# ls -la *.sql
-rw-r--r-- 1 root root 1642 10-10 17:17 a.sql
-rw-r--r-- 1 root root 5998 10-20 13:27 jiaowu.sql
-rw-r--r-- 1 root root 0 10-20 14:46 studb-2020-10-20-14-46-1603176408.sql
-rw-r--r-- 1 root root 6022 10-20 14:46 studb-2020-10-20-14-46-1603176415.sql
-rw-r--r-- 1 root root 6170 10-20 14:48 studb-2020-10-20-14-48-1603176502.sql
-rw-r--r-- 1 root root 5997 10-20 14:14 studb.sql
-rw-r--r-- 1 root root 71 09-15 16:49 test.sql
[root@mail ~]#
[root@mail ~]# less studb-2020-10-20-14-48-1603176502.sql
-- MySQL dump 10.13 Distrib 5.5.28, for Linux (i686)
--
-- Host: localhost Database: studb
-- ------------------------------------------------------
-- Server version 5.5.28-log
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Position to start replication or point-in-time recovery from
--
# 下面这一句明确说明了 当前二进制日志文件,及位置,,, 备份恢复时,就是从这个位置开始的
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000030', MASTER_LOG_POS=107;
--
-- Table structure for table `courses`
--
DROP TABLE IF EXISTS `courses`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `courses` (
`cid` int(11) NOT NULL AUTO_INCREMENT,
`cname` char(30) DEFAULT NULL,
`tid` int(11) DEFAULT NULL,
PRIMARY KEY (`cid`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1;
mysqldump对myisam 只能实现温备,要温备必须要锁定(读锁)所有表 ,,,所以要lock ,flush 什么的,执行好多操作
此时能记录二进制日志的名称,位置,(--master-data=2)
我们可以不用手动去锁表了,mysqldump可以自动去锁表的(--lock-all-tables)
#备份所有数据库 (为何用 --lock-all-tables,不用 --single-transaction,因为并不是所有数据库都是 InnoDB的)
[root@mail ~]# mysqldump -uroot -p --lock-all-tables --flush-logs --all-databases > /root/all.sql
Enter password:
[root@mail ~]#
#还要有--master-data=2,记录日志文件及其位置
[root@mail ~]# mysqldump -uroot -p --lock-all-tables --flush-logs --master-data=2 --all-databases > /root/all.sql
Enter password:
[root@mail ~]#
[root@mail ~]# pwd
/root
[root@mail ~]# ls -la *.sql
-rw-r--r-- 1 root root 526607 10-20 15:36 all.sql
-rw-r--r-- 1 root root 1642 10-10 17:17 a.sql
-rw-r--r-- 1 root root 5998 10-20 13:27 jiaowu.sql
-rw-r--r-- 1 root root 0 10-20 14:46 studb-2020-10-20-14-46-1603176408.sql
-rw-r--r-- 1 root root 6022 10-20 14:46 studb-2020-10-20-14-46-1603176415.sql
-rw-r--r-- 1 root root 6170 10-20 14:48 studb-2020-10-20-14-48-1603176502.sql
-rw-r--r-- 1 root root 5997 10-20 14:14 studb.sql
-rw-r--r-- 1 root root 71 09-15 16:49 test.sql
[root@mail ~]#
[root@mail ~]# less all.sql
-- MySQL dump 10.13 Distrib 5.5.28, for Linux (i686)
--
-- Host: localhost Database:
-- ------------------------------------------------------
-- Server version 5.5.28-log
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Position to start replication or point-in-time recovery from
--
#日志文件及位置
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000033', MASTER_LOG_POS=107;
--
-- Current Database: `cactidb`
--
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `cactidb` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `cactidb`;
--
-- Table structure for table `testdb`
--
DROP TABLE IF EXISTS `testdb`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `testdb` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` char(20) DEFAULT NULL,
`age` tinyint(3) unsigned DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=latin1;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `testdb`
--
#备份前锁定
LOCK TABLES `testdb` WRITE;
/*!40000 ALTER TABLE `testdb` DISABLE KEYS */;
INSERT INTO `testdb` VALUES (1,'Tom',30);
/*!40000 ALTER TABLE `testdb` ENABLE KEYS */;
UNLOCK TABLES;
--
-- Current Database: `edb`
--
#创建库
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `edb` /*!40100 DEFAULT CHARACTER SET latin1 */;
#当前库
USE `edb`;
--
-- Current Database: `hellodb`
--
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `hellodb` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `hellodb`;
--
-- Current Database: `mydb`
--
CREATE DATABASE /*!32312 IF NOT EXISTS*/ `mydb` /*!40100 DEFAULT CHARACTER SET latin1 */;
USE `mydb`;
.................................
.................................
备份策略: 每周完全+每日增量 即时点还原
完全备份: mysqldump
增量备份: 备份二进制日志文件(复制一下就行了) (每次先 flush logs 一下,会更简单,,,,不flush logs也可以,直接从mysqldump备份后的文件中指定的日志及位置往后备份就可以了)
[root@mail ~]# mysqldump -uroot -p --master-data=2 --lock-all-tables --flush-logs --all-databases > alldatabases.sql
Enter password:
[root@mail ~]#
[root@mail ~]# less alldatabases.sql
....................................... #看到二进制日志及其位置了,
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000034', MASTER_LOG_POS=107;
.......................................
mysql> purge binary logs to 'mysql-bin.000034'; #删掉以前的日志,最好先备份下(先复制下),防止将来有救急作用 #删的目的是怕将来日志会塞满磁盘 #最好通过 mysql进程执行 purge ,不要使用rm来删除
Query OK, 0 rows affected (0.09 sec)
mysql>
mysql> show binary logs; # 显示正在使用的有用的二进制日志
+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000034 | 107 |
+------------------+-----------+
1 row in set (0.00 sec)
mysql>
mysql> use studb;
Database changed
mysql> select * from tutors;
+-----+--------------+--------+------+
| tid | tname | gender | age |
+-----+--------------+--------+------+
| 1 | HongQigong | M | 93 |
| 2 | HuangYaoshi | M | 63 |
| 3 | Miejueshitai | F | 72 |
| 4 | OuYangfend | M | 76 |
| 5 | YiDeng | M | 90 |
| 6 | YuCanghai | M | 56 |
| 7 | Jinlunfawang | M | 67 |
| 8 | HuYidao | M | 42 |
| 9 | NingZhongze | F | 49 |
| 10 | tom | F | 30 |
| 11 | DingDian | M | 25 |
| 12 | HuFei | M | 70 |
| 13 | stu111 | F | 60 |
| 14 | stu22 | F | 50 |
| 15 | stu100 | M | 30 |
| 16 | hellodb | NULL | NULL |
+-----+--------------+--------+------+
16 rows in set (0.00 sec)
mysql> delete from tutors where age>80;
Query OK, 2 rows affected (0.01 sec)
mysql> select * from tutors; #发现,删了两行
+-----+--------------+--------+------+
| tid | tname | gender | age |
+-----+--------------+--------+------+
| 2 | HuangYaoshi | M | 63 |
| 3 | Miejueshitai | F | 72 |
| 4 | OuYangfend | M | 76 |
| 6 | YuCanghai | M | 56 |
| 7 | Jinlunfawang | M | 67 |
| 8 | HuYidao | M | 42 |
| 9 | NingZhongze | F | 49 |
| 10 | tom | F | 30 |
| 11 | DingDian | M | 25 |
| 12 | HuFei | M | 70 |
| 13 | stu111 | F | 60 |
| 14 | stu22 | F | 50 |
| 15 | stu100 | M | 30 |
| 16 | hellodb | NULL | NULL |
+-----+--------------+--------+------+
14 rows in set (0.00 sec)
mysql>
下面做增量备份
mysql> flush logs;
Query OK, 0 rows affected (0.01 sec)
[root@mail ~]# cd /mydata2/data
[root@mail data]# ls
cactidb mail-slow.log mysql-bin.000006 studb
edb mydb mysql-bin.000007 students
hellodb mysql mysql-bin.000008 test
ibdata1 mysql-bin.000001 mysql-bin.000009 test2
ib_logfile0 mysql-bin.000002 mysql-bin.000034 testdb
ib_logfile1 mysql-bin.000003 mysql-bin.000035
mail.magedu.com.err mysql-bin.000004 mysql-bin.index
mail.magedu.com.pid mysql-bin.000005 performance_schema
[root@mail data]# pwd
/mydata2/data
[root@mail data]#
假设星期一
[root@mail data]# cp mysql-bin.000034 /root/ #复制一下二进制日志文件 (当然可以改改名,哪个数据库的哪一天的增量)
或者 下面的方法更好
[root@mail data]# mysqlbinlog mysql-bin.000034 > /root/mon-incremental.sql #
[root@mail data]#
假设星期二
mysql> flush logs;
Query OK, 0 rows affected (0.01 sec)
mysql> use studb;
Database changed
mysql> insert into tutors (tname) values ('stu123');
Query OK, 1 row affected (0.01 sec)
[root@mail data]# pwd
/mydata2/data
[root@mail data]# cp mysql-bin.000035 /root
[root@mail data]#
假如一不小心,删除了整个数据库(不要删二进制日志)(事实上我们假设二进制日志与数据文件不在同一块盘上)
[root@mail data]# rm -rf ./*
[root@mail data]#
[root@mail data]# service mysqld stop #服务器都停不掉了
MySQL server PID file could not be found! [失败]
[root@mail data]#
[root@mail data]# killall mysqld # 杀死mysql进程
[root@mail data]#
数据没了,启动不了的,先去初始化mysql库
[root@mail data]# cd
[root@mail ~]# cd /usr/local/mysql
[root@mail mysql]# ls
bin docs lib README sql-bench
COPYING include man scripts support-files
data INSTALL-BINARY mysql-test share test.txt
[root@mail mysql]# scripts/mysql_install_db --user=mysql --datadir=/mydata2/data
Installing MySQL system tables...
OK
Filling help tables...
OK
To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:
./bin/mysqladmin -u root password 'new-password'
./bin/mysqladmin -u root -h mail.magedu.com password 'new-password'
Alternatively you can run:
./bin/mysql_secure_installation
which will also give you the option of removing the test
databases and anonymous user created by default. This is
strongly recommended for production servers.
See the manual for more instructions.
You can start the MySQL daemon with:
cd . ; ./bin/mysqld_safe &
You can test the MySQL daemon with mysql-test-run.pl
cd ./mysql-test ; perl mysql-test-run.pl
Please report any problems with the ./bin/mysqlbug script!
[root@mail mysql]#
[root@mail mysql]# service mysqld start # 先启动数据库
Starting MySQL.... [确定]
[root@mail mysql]#
[root@mail ~]# cd
[root@mail ~]# pwd
/root
[root@mail ~]# ls *sql
alldatabases.sql mon-incremental.sql studb.sql
all.sql studb-2020-10-20-14-46-1603176408.sql test.sql
a.sql studb-2020-10-20-14-46-1603176415.sql
jiaowu.sql studb-2020-10-20-14-48-1603176502.sql
[root@mail ~]#
[root@mail ~]# mysql -uroot -p < alldatabases.sql #导入完全备份 ,这里是刚初始化的mysql 用户名为root 密码为空
Enter password:
[root@mail ~]#
mysql> use studb;
Database changed
mysql> select * from tutors; #大于80的用户都在
+-----+--------------+--------+------+
| tid | tname | gender | age |
+-----+--------------+--------+------+
| 1 | HongQigong | M | 93 |
| 2 | HuangYaoshi | M | 63 |
| 3 | Miejueshitai | F | 72 |
| 4 | OuYangfend | M | 76 |
| 5 | YiDeng | M | 90 |
| 6 | YuCanghai | M | 56 |
| 7 | Jinlunfawang | M | 67 |
| 8 | HuYidao | M | 42 |
| 9 | NingZhongze | F | 49 |
| 10 | tom | F | 30 |
| 11 | DingDian | M | 25 |
| 12 | HuFei | M | 70 |
| 13 | stu111 | F | 60 |
| 14 | stu22 | F | 50 |
| 15 | stu100 | M | 30 |
| 16 | hellodb | NULL | NULL |
+-----+--------------+--------+------+
16 rows in set (0.00 sec)
mysql>
[root@mail ~]# mysql -uroot -p < mon-incremental.sql #还原星期一的增量备份
Enter password:
[root@mail ~]#
mysql> use studb;
Database changed
mysql> select * from tutors; #大于80的没了
+-----+--------------+--------+------+
| tid | tname | gender | age |
+-----+--------------+--------+------+
| 2 | HuangYaoshi | M | 63 |
| 3 | Miejueshitai | F | 72 |
| 4 | OuYangfend | M | 76 |
| 6 | YuCanghai | M | 56 |
| 7 | Jinlunfawang | M | 67 |
| 8 | HuYidao | M | 42 |
| 9 | NingZhongze | F | 49 |
| 10 | tom | F | 30 |
| 11 | DingDian | M | 25 |
| 12 | HuFei | M | 70 |
| 13 | stu111 | F | 60 |
| 14 | stu22 | F | 50 |
| 15 | stu100 | M | 30 |
| 16 | hellodb | NULL | NULL |
+-----+--------------+--------+------+
14 rows in set (0.00 sec)
mysql>
[root@mail ~]# mysqlbinlog mysql-bin.000035 > temp.sql # 把最后备份的二进制文件导出为sql文件
[root@mail ~]#
[root@mail ~]# mysql -u root -p < temp.sql #导入这最后备份的二进制文件所转成的sql文件
Enter password:
当然上面两行可以简化为 # mysqlbinlog mysql-bin.000035 | mysql -u root -p #通过管道送给mysql命令执行
[root@mail ~]#
mysql> use studb;
Database changed
mysql> select * from tutors; #可以看到最后一行是最后一天新增加的用户
+-----+--------------+--------+------+
| tid | tname | gender | age |
+-----+--------------+--------+------+
| 2 | HuangYaoshi | M | 63 |
| 3 | Miejueshitai | F | 72 |
| 4 | OuYangfend | M | 76 |
| 6 | YuCanghai | M | 56 |
| 7 | Jinlunfawang | M | 67 |
| 8 | HuYidao | M | 42 |
| 9 | NingZhongze | F | 49 |
| 10 | tom | F | 30 |
| 11 | DingDian | M | 25 |
| 12 | HuFei | M | 70 |
| 13 | stu111 | F | 60 |
| 14 | stu22 | F | 50 |
| 15 | stu100 | M | 30 |
| 16 | hellodb | NULL | NULL |
| 17 | stu123 | NULL | NULL |
+-----+--------------+--------+------+
15 rows in set (0.00 sec)
mysql>
数据大的话,用mysql做完全备份速度太慢了,维护起来不方便,可能会丢失精度的;;数据量小,没有问题
写一个mysql备份脚本,
在凌晨 任务计划执行
完全备份写在脚本里,增量备份写在另一个脚本里;尽可能使用变量来定义保存位置,尽可能使用日期来保存备份的名称
再写一个脚本来实施还原