前言
通常情况下,我们需要改什么地方就备份什么地方就可以了,但也免不了需要整库备份的时候,本文记录实现MysqL使用脚本进行整库数据备份【表(结构+数据)、视图、函数、事件】
主要是使用MysqLdump.exe,MysqLdump 是 MysqL 用于转存储数据库的实用程序。它主要产生一个 sql 脚本,其中包含从头重新创建数据库所必需的命令 CREATE TABLE INSERT 等。
为方便测试,使用java先造一下测试数据
package cn.huanzi.qch; import java.io.File; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * 造一批数据,方便进行测试 */ public class App { public static void main(String[] args) { SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd"); for (int i = 1; i <= 10; i++) { //当前时间-i天 Calendar c = Calendar.getInstance(); c.setTime(new Date()); c.add(Calendar.DATE, -1 * i); try { File filetochange = new File("D:\\MysqL_data_back\\jfinal_demo_"+simpleDateFormat.format(c.getTime())+".sql"); filetochange.createNewFile(); //更改最后修改时间 filetochange.setLastModified(c.getTime().getTime()); } catch (IOException e) { e.printstacktrace(); } } } }
bat脚本
:: MysqL整库数据备份脚本【表(结构+数据)、视图、函数、事件】,支持备份远程库 :: 注:bat解决中文乱码:改成使用ANSI格式 :: 注:MysqL服务器版本号、客户端版本要一致,否则会报错 @echo OFF echo 删掉之前的数据,只保留7天... :: 删掉之前的数据,按修改时间只保留7天(cmd使用set后forfiles失败,只能放在前面执行了) ::forfiles /p "D:\MysqL_data_back" /s /m *.sql /d -7 /c "cmd /c echo @file" forfiles /p "D:\MysqL_data_back" /s /m *.sql /d -7 /c "cmd /c del @path"; :: 年月日,路径 set ymd=%date:~,4%%date:~5,2%%date:~8,2% set path=D:\MysqL_data_back :: 数据库地址、端口,数据库、账号、密码 set ip=127.0.0.1 set port=3306 set dbname=jfinal_demo set username=root set password=123456 echo 开始备份,文件生成路径:%path%... :: -h地址 -P端口 -u账号 -p密码 数据库 :: 常用命令: :: --no-create-db, -n/--no-create-info, -t 只导出数据,而不添加CREATE TABLE 语句 :: --no-data, -d 不导出任何数据,只导出数据库表结构 :: --routines, -R 导出存储过程以及自定义函数 :: --events, -E 导出事件 :: --force 在导出过程中忽略出现的sql错误 D:\MysqL5.5\bin\MysqLdump.exe -P%port% -h%ip% -u%username% -p"%password%" %dbname% -R -E> %path%\%dbname%_%ymd%.sql echo %path%\%dbname%_%ymd%.sql,备份完成! :: 执行完不关闭窗口 pause
使用forfiles命令,可以快速实现备份数据保留7天
下面这个命令是筛选出7天之前的文件
shell脚本
#!/bin/bash # MysqL整库数据备份脚本【表(结构+数据)、视图、函数、事件】,支持备份远程库 # 注:bat解决中文乱码:改成使用ANSI格式 # 注:MysqL服务器版本号、客户端版本要一致,否则会报错 # 年月日,路径 export ymd=`date +%Y%m%d` export path=/root/MysqL/MysqL_data_back # 数据库地址、端口,数据库、账号、密码 export ip='127.0.0.1' export port='3306' export dbname='test' export username='root' export password='123456' echo "删掉之前的数据,只保留7天..." # 删掉之前的数据,按修改时间只保留7天 find $path -type f -name "*.sql" -mtime +7 -exec rm -rf {} \; echo "开始备份,文件生成路径:$path..." # -h地址 -P端口 -u账号 -p密码 数据库 # 常用命令: # --no-create-db, -n/--no-create-info, -t 只导出数据,而不添加CREATE TABLE 语句 # --no-data, -d 不导出任何数据,只导出数据库表结构 # --routines, -R 导出存储过程以及自定义函数 # --events, -E 导出事件 # --force 在导出过程中忽略出现的sql错误 /usr/bin/MysqLdump -P$port -h$ip -u$username -p"$password" $dbname -R -E> $path/$dbname$ymd.sql echo "$path/$dbname$ymd.sql,备份完成!"
首先把我们生成的测试文件上传到linux,并修改文件的修改日期,cd到对应文件夹,执行以下命令
touch -d "2021-08-21 03:41:10" test20210821.sql& touch -d "2021-08-22 03:41:10" test20210822.sql& touch -d "2021-08-23 03:41:10" test20210823.sql& touch -d "2021-08-24 03:41:10" test20210824.sql& touch -d "2021-08-25 03:41:10" test20210825.sql& touch -d "2021-08-26 03:41:10" test20210826.sql& touch -d "2021-08-27 03:41:10" test20210827.sql& touch -d "2021-08-28 03:41:10" test20210828.sql& touch -d "2021-08-29 03:41:10" test20210829.sql& touch -d "2021-08-30 03:41:10" test20210830.sql&
forfiles命令是window特有的,因此要改成find的方式查找文件
效果
bat脚本
shell脚本
生成的sql文件,包含表(结构+数据)、视图、函数/存储过程、事件
-- MysqL dump 10.13 distrib 5.5.28, for Win64 (x86) -- -- Host: 127.0.0.1 Database: jfinal_demo -- ------------------------------------------------------ -- Server version 5.5.28 /*!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 */; -- -- Table structure for table `blog` -- DROP TABLE IF EXISTS `blog`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `blog` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '博客id', `title` varchar(200) DEFAULT NULL COMMENT '博客标题', `content` mediumtext COMMENT '博客内容', `user_id` varchar(255) DEFAULT NULL COMMENT '用户id', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8 COMMENT='博客表'; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `blog` -- LOCK TABLES `blog` WRITE; /*!40000 ALTER TABLE `blog` disABLE KEYS */; INSERT INTO `blog` VALUES (2,'test 1','test 1','1'),(3,'test 2','test 2','1'),(4,'test 4','test 4','2'),(5,'test 5','test 5','2'),(6,'test 6','test 6','1'),(11,'11','11','3'),(12,'12','12','3'),(13,'13','13','3'),(14,'14','14','3'),(15,'15','15','3'),(16,'16','16','3'); /*!40000 ALTER TABLE `blog` ENABLE KEYS */; UNLOCK TABLES; -- -- Table structure for table `user` -- DROP TABLE IF EXISTS `user`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!40101 SET character_set_client = utf8 */; CREATE TABLE `user` ( `user_id` varchar(255) NOT NULL COMMENT '用户id', `user_name` varchar(255) DEFAULT NULL COMMENT '用户名称', PRIMARY KEY (`user_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户表'; /*!40101 SET character_set_client = @saved_cs_client */; -- -- Dumping data for table `user` -- LOCK TABLES `user` WRITE; /*!40000 ALTER TABLE `user` disABLE KEYS */; INSERT INTO `user` VALUES ('1','张三'),('2','李四'),('3','王五'); /*!40000 ALTER TABLE `user` ENABLE KEYS */; UNLOCK TABLES; -- -- Temporary table structure for view `v_test` -- DROP TABLE IF EXISTS `v_test`; /*!50001 DROP VIEW IF EXISTS `v_test`*/; SET @saved_cs_client = @@character_set_client; SET character_set_client = utf8; /*!50001 CREATE TABLE `v_test` ( `id` tinyint NOT NULL, `title` tinyint NOT NULL, `content` tinyint NOT NULL, `user_id` tinyint NOT NULL, `user_name` tinyint NOT NULL ) ENGINE=MyISAM */; SET character_set_client = @saved_cs_client; -- -- Dumping events for database 'jfinal_demo' -- /*!50106 SET @save_time_zone= @@TIME_ZONE */ ; /*!50106 DROP EVENT IF EXISTS `ev_test` */; DELIMITER ;; /*!50003 SET @saved_cs_client = @@character_set_client */ ;; /*!50003 SET @saved_cs_results = @@character_set_results */ ;; /*!50003 SET @saved_col_connection = @@collation_connection */ ;; /*!50003 SET character_set_client = utf8mb4 */ ;; /*!50003 SET character_set_results = utf8mb4 */ ;; /*!50003 SET collation_connection = utf8mb4_general_ci */ ;; /*!50003 SET @saved_sql_mode = @@sql_mode */ ;; /*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;; /*!50003 SET @saved_time_zone = @@time_zone */ ;; /*!50003 SET time_zone = 'SYstem' */ ;; /*!50106 CREATE*/ /*!50117 DEFINER=`root`@`localhost`*/ /*!50106 EVENT `ev_test` ON SCHEDULE EVERY 3 SECOND STARTS '2021-08-31 11:02:25' ON COMPLETION PRESERVE disABLE DO BEGIN END */ ;; /*!50003 SET time_zone = @saved_time_zone */ ;; /*!50003 SET sql_mode = @saved_sql_mode */ ;; /*!50003 SET character_set_client = @saved_cs_client */ ;; /*!50003 SET character_set_results = @saved_cs_results */ ;; /*!50003 SET collation_connection = @saved_col_connection */ ;; DELIMITER ; /*!50106 SET TIME_ZONE= @save_time_zone */ ; -- -- Dumping routines for database 'jfinal_demo' -- /*!50003 DROP FUNCTION IF EXISTS `fun_test` */; /*!50003 SET @saved_cs_client = @@character_set_client */ ; /*!50003 SET @saved_cs_results = @@character_set_results */ ; /*!50003 SET @saved_col_connection = @@collation_connection */ ; /*!50003 SET character_set_client = utf8mb4 */ ; /*!50003 SET character_set_results = utf8mb4 */ ; /*!50003 SET collation_connection = utf8mb4_general_ci */ ; /*!50003 SET @saved_sql_mode = @@sql_mode */ ; /*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; /*!50003 CREATE*/ /*!50020 DEFINER=`root`@`localhost`*/ /*!50003 FUNCTION `fun_test`() RETURNS int(11) BEGIN #Routine body goes here... RETURN 0; END */;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; /*!50003 SET character_set_client = @saved_cs_client */ ; /*!50003 SET character_set_results = @saved_cs_results */ ; /*!50003 SET collation_connection = @saved_col_connection */ ; /*!50003 DROP PROCEDURE IF EXISTS `pro_test` */; /*!50003 SET @saved_cs_client = @@character_set_client */ ; /*!50003 SET @saved_cs_results = @@character_set_results */ ; /*!50003 SET @saved_col_connection = @@collation_connection */ ; /*!50003 SET character_set_client = utf8mb4 */ ; /*!50003 SET character_set_results = utf8mb4 */ ; /*!50003 SET collation_connection = utf8mb4_general_ci */ ; /*!50003 SET @saved_sql_mode = @@sql_mode */ ; /*!50003 SET sql_mode = 'STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ; DELIMITER ;; /*!50003 CREATE*/ /*!50020 DEFINER=`root`@`localhost`*/ /*!50003 PROCEDURE `pro_test`() BEGIN #Routine body goes here... END */;; DELIMITER ; /*!50003 SET sql_mode = @saved_sql_mode */ ; /*!50003 SET character_set_client = @saved_cs_client */ ; /*!50003 SET character_set_results = @saved_cs_results */ ; /*!50003 SET collation_connection = @saved_col_connection */ ; -- -- Final view structure for view `v_test` -- /*!50001 DROP TABLE IF EXISTS `v_test`*/; /*!50001 DROP VIEW IF EXISTS `v_test`*/; /*!50001 SET @saved_cs_client = @@character_set_client */; /*!50001 SET @saved_cs_results = @@character_set_results */; /*!50001 SET @saved_col_connection = @@collation_connection */; /*!50001 SET character_set_client = utf8mb4 */; /*!50001 SET character_set_results = utf8mb4 */; /*!50001 SET collation_connection = utf8mb4_general_ci */; /*!50001 CREATE ALGORITHM=UNDEFINED */ /*!50013 DEFINER=`root`@`localhost` sql Security DEFINER */ /*!50001 VIEW `v_test` AS select `b`.`id` AS `id`,`b`.`title` AS `title`,`b`.`content` AS `content`,`b`.`user_id` AS `user_id`,`u`.`user_name` AS `user_name` from (`blog` `b` left join `user` `u` on((`b`.`user_id` = `u`.`user_id`))) */; /*!50001 SET character_set_client = @saved_cs_client */; /*!50001 SET character_set_results = @saved_cs_results */; /*!50001 SET collation_connection = @saved_col_connection */; /*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; /*!40101 SET sql_mode=@OLD_sql_mode */; /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; /*!40101 SET CHaraCTER_SET_CLIENT=@OLD_CHaraCTER_SET_CLIENT */; /*!40101 SET CHaraCTER_SET_RESULTS=@OLD_CHaraCTER_SET_RESULTS */; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET sql_NOTES=@OLD_sql_NOTES */; -- Dump completed on 2021-08-31 15:21:04
恢复数据
-- 创建数据库 create database jfinal_demo; -- 使用已创建的数据库 use jfinal_demo; -- 设置编码 set names utf8; -- 导入备份数据库 source '文件路径' commit;
后记
需要进行备份时(例如:更新代码、进行系统版本迭代等),双击执行脚本即可
可以在配置定时执行脚本,实现自动备份
Navicat数据迁移
工具 -> 数据传输
Oracle备份/恢复
PS:可以使用tables命令,按需导出、导入表(‘_’匹配任何一个字符,'%'则匹配任何数量的字符包括0个字符)
导入导出“TBXX”开头的表 tables=TBXX% 导入导出ABC三个表 tables=(A,B,C)
Oracle可以使用 exp 命令进行数据备份,例如:(整库备份)
D:\orcale\11.2.0\dbhome_1\BIN\exp username/password@127.0.0.1:1521/orcl file="E:\backup_files\test.DMP" log="E:\backup_files_log\test.txt"
exp命令大全
关键字 说明 默认 USERID 用户名/口令 FULL 导出整个文件 (N) BUFFER 数据缓冲区的大小 OWNER 导出指定的所有者用户名列表 FILE 输出文件 (EXPDAT.DMP) TABLES 导出指定的表名列表 COMPRESS 是否压缩导出的文件 (Y) RECORDLENGTH IO 记录的长度 GRANTS 导出权限 (Y) INCTYPE 增量导出类型 INDEXES 导出索引 (Y) RECORD 跟踪增量导出 (Y) ROWS 导出数据行 (Y) PARFILE 参数文件名 CONSTRAINTS 导出限制 (Y) CONSISTENT 交叉表一致性 LOG 屏幕输出的日志文件 STATISTICS 分析对象(ESTIMATE) DIRECT 直接路径 (N) TRIGGERS 导出触发器 (Y) FeedBACK 显示每 x 行 (0) 的进度 FILESIZE 各转储文件的最大尺寸 QUERY 选定导出表子集的子句 TRANSPORT_TABLESPACE 导出可传输的表空间元数据 (N) TABLESPACES 导出指定的表空间列表
Oracle可以使用 imp 命令恢复数据(仅导入指定表)
imp username/password@127.0.0.1:1521/orcl file=E:\backup_files\test.DMP log=E:\backup_files\test.log tables=(table1)
imp命令大全
关键字 说明 默认 USERID 用户名/口令 FULL 导入整个文件 (N) BUFFER 数据缓冲区大小 FROMUSER 所有人用户名列表 FILE 输入文件 (EXPDAT.DMP) TOUSER 用户名列表 SHOW 只列出文件内容 (N) TABLES 表名列表 IGnorE 忽略创建错误 (N) RECORDLENGTH IO记录的长度 GRANTS 导入权限 (Y) INCTYPE 增量导入类型 INDEXES 导入索引 (Y) COMMIT 提交数组插入 (N) ROWS 导入数据行 (Y) PARFILE 参数文件名 LOG 屏幕输出的日志文件 CONSTRAINTS 导入限制 (Y) DESTROY 覆盖表空间数据文件 (N) INDEXFILE 将表/索引信息写入指定的文件 SKIP_UNUSABLE_INDEXES 跳过不可用索引的维护 (N) FeedBACK 每 x 行显示进度 TOID_NovalIDATE 跳过指定类型 ID 的验证 FILESIZE 每个转储文件的最大大小 STATISTICS 始终导入预计算的统计信息 RESUMABLE 在遇到有关空间的错误时挂起 RESUMABLE_NAME 用来标识可恢复语句的文本字符串 RESUMABLE_TIMEOUT RESUMABLE 的等待时间 COMPILE 编译过程, 程序包和函数 (Y) STREAMS_CONfigURATION 导入 Streams 的一般元数据 (Y) STREAMS_INSTANITATION 导入 Streams 的实例化元数据 (N) TRANSPORT_TABLESPACE 导入可传输的表空间元数据 TABLESPACES 将要传输到数据库的表空间 DATAFILES 将要传输到数据库的数据文件 TTS_OWNERS 拥有可传输表空间集中数据的用户
Oracle创建/删除用户
-- 创建用户并赋予密码 create user "TEST_USER" identified by "TESTUSER_123456"; -- 授予用户登录数据库权限 grant create session to "TEST_USER"; -- 授予用户增删改表权限 grant create table to "TEST_USER"; -- 授予用户dba权限 grant dba to "TEST_USER"; -- 删除用户以及用户下的所有数据 drop user "TEST_USER" cascade; -- 给其他用户分配指定表的查询权限 grant select on TEST_TABLE to TEST_USER2;