使⽤mysqldump命令⽣成SQL脚本
⽬录
1、
<⽂件是MySQL的⼀个命令⽂件,在安装⽬录MySQL Server 5.6\bin下可以到。
此次分享的两个例⼦都是基于mysqldump命令,关于该命令的具体作⽤和参数可⾃⾏百度查阅材料。
笔者亲测,可以在没有安装MySQL的电脑使⽤该命令,只需将⽂件下载/拷贝到电脑中即可。
下⾯我通过⼀个简单的例⼦来简单演⽰下mysqldump的使⽤。
⾸先,先在测试数据库建⼀个表,插⼊数据:
create table test.t_dict(
dict_code varchar(32) not null,
dict_name varchar(64) not null,
PRIMARY KEY (dict_code) USING BTREE
);
mysql存储文档insert into test.t_dict(dict_code,dict_name) values('test1','测试1');
insert into test.t_dict(dict_code,dict_name) values('test2','测试2');
假设我们的⽂件在D盘根⽬录下,进⼊cmd,执⾏以下命令:
mysqldump -h你的数据库服务器IP -u账号 -p密码 --lock-tables=0 --compact --no-create-info --skip-comments test t_dict > D:/t_dict_20210721.sql
执⾏完毕后,可以在D盘到⽣成的SQL⽂件:t_dict_20210721.sql
打开⽂件:
2、Java实现批量⽣成SQL脚本
场景:系统上线,需要同步数据库的数据到⽣产数据库,除了第⼀次是全量同步,后续的迭代都是增量,主要由于开发/测试环境有很多测试数据,如果全量同步,会造成数据异常,因此每次发布需要出当次发布的数据,精准同步数据。
以test.t_dict为例,假如本次发布只需要更新dict_code='test1'这条记录,我们其实只需⽣成该条记录即可,最主要是使⽤mysqldump命
令中的-w参数,参数值就是where条件,以这个为例⼦,我们可以在cmd单独执⾏下:
mysqldump -h你的MySQL数据库IP -u账号 -p密码 --lock-tables=0 --compact --no-create-info --skip-comments test t_dict -w"dict_code='test1'" > D:/t_dict_2021072
以上就是基本原理。
但实际中我们是要同步不同表的数据,在这种情况下,使⽤mysqldump命令每次只能⽣成⼀张表的数据。
基本思路:⾸先整理所有查询SQL的语句放到指定⽂件,Java读取⽂件,存到字符串,将语句分拆成单独的每⼀条查询SQL,然后循环使
⽤命令⾏⽣成每张表的insert脚本,最后将所有insert脚本汇总。
以下是完整实现代码:
package com.util;
import org.apachemons.lang3.StringUtils;
public class MySQLUtil {
public static void main(String argsp[])
{
String basepath =Resource("").toString();
String ssql_file_place("file:/", "")+"";
String sql_StringFromFile(ssql_file_path);
String []sql_seg_arr=sql_segs.split(";");
String migrate_sql_file_dir_path="D:/workspace/demo/src/java/com/util";
String ms_str="";
for(String per_seg : sql_seg_arr)
{
if(!StringUtils.isEmpty(placeAll("\\r\\n", "")))
{
per_seg.indexOf("where");
String seg_from=per_seg.substring(0,per_seg.indexOf("where"));
String seg_where=per_seg.substring(per_seg.indexOf("where")+6);
String cmd = "cmd /c C:/mysqldump -h你的数据库IP -u账号 -p密码 --lock-tables=0 --compact --no-create-info --skip-comments 你的MySQL库名 "; String tf=migrate_sql_file_dir_path+"/"+seg_from.split("from")[1].trim()+"_"+und(Math.random()*10000)+".sql";
cmd=cmd+seg_from.split("from")[1].trim()+" -w\""+placeAll("\\r\\n", "")+"\" > "+tf;
try {
Process child = Runtime().exec(cmd);
int tag = child.waitFor();// 等待进程终⽌
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(cmd);
ms_str+=StringFromFile(tf);
}
}
ms_str = placeAll("SET @(.+);", "");
System.out.println(ms_str);
FileUtil.wirteStringToFile(migrate_sql_file_dir_path+"/insert.sql", ms_str);
}
}
package common.util;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.URL;
/
**
⽂件操作实体类
*/
public class FileUtil {
/* 往⽂件写⼊字符串 */
public static void wirteStringToFile(String path, String context) {
public static void wirteStringToFile(String path, String context) {
OutputStreamWriter osw = null;
try {
File file = new File(path);
if (!ists()) {
file = new Parent());
if (!ists()) {
file.mkdirs();
}
}
osw = new OutputStreamWriter(new FileOutputStream(path), Property("ding")); osw.write(new Bytes(), Property("ding")));
osw.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (osw != null) {
osw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
/* 读取⽂件中的字符串 */
public static String getStringFromFile(String path) {
String data = null;
/
/ 判断⽂件是否存在
File file = new File(path);
if (!ists()) {
return data;
}
// 获取⽂件编码格式
String code = getFileEncode(path);
InputStreamReader isr = null;
try {
// 根据编码格式解析⽂件
if ("asci".equals(code)) {
/
/ 这⾥采⽤GBK编码,⽽不⽤环境编码格式,因为环境默认编码不等于操作系统编码
// code = Property("ding");
code = "GBK";
}
isr = new InputStreamReader(new FileInputStream(file), code);
// 读取⽂件内容
int length = -1;
char[] buffer = new char[1024];
StringBuffer sb = new StringBuffer();
while ((length = ad(buffer, 0, 1024)) != -1) {
sb.append(buffer, 0, length);
}
data = new String(sb);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (isr != null) {
isr.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return data;
return data;
}
}
3、bat批处理⽂件实现数据库备份
场景:由于新上线的⼀个项⽬,开发⼈员没有控制好delete的删除条件,在某种情况下会导致删除表的全部数据,由于表格数据更新不频繁,因此在bug修复前,先通过每天⾃动备份,以免数据再次丢失。
以下是实现代码:
@echo off
rem 脚本使⽤配置开始=======================start
::设置数据库所在ip
set ip=数据库所在ip
::设置数据库端⼝
set port=数据库端⼝
::设置数据库连接⽤户(为了保证导出函数,视图,存储过程,触发器请给⽤户设置权限)
set user=账号
::设置数据库连接⽤户密码(密码中的%需要两个%%转义)
set password="密码"
::设置备份⽂件存储位置
set dataFolder=D:/mysql_backup
:
:设置压缩软件WinRAR的安装⽬录
set winrarPath="C:\Program Files\WinRAR"
::设置MySQL的安装⽬录的安装⽬录
set mysqlPath="D:\Program Files\MySQL\MySQL Server 5.6\bin"
::设置备份⽇期
set curdate=%date:~0,4%%date:~5,2%%date:~8,2%
rem 脚本使⽤配置结束=======================end
echo 开始备份=======
%mysqlPath%\ -R -u%user% -p%password% -h%ip% -P%port% 需要备份的数据库名 > %dataFolder%/backup_%curdate%.sql
rem 压缩备份⽂件
::若压缩⽂件存在,先删除
if exist "%dataFolder%/nonauto_backup_%curdate%.rar" (
del %dataFolder%/nonauto_backup_%curdate%.rar
)
::使⽤WinRAR压缩⽂件并删除源⽂件
echo 开始压缩=======
%winrarPath%\ a -k -r -s -m5 -ep1 -df %dataFolder%/nonauto_backup_%curdate%.rar %dataFolder%/backup_%curdate%.sql
echo 备份结束
设置定时任务,可以参考我的另⼀篇博客:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论