我倒是有个方法,以前我做个mysql数据库备份,备份的时候也就是赋值数据库的过程,当然能知道大小了,要是想实时获取的话那就就定义一个线程来空值就可以了,代码大概如下:其中赋值的过程楼主可省略,你要的就是一个值,就是sb的大小。。
package comhuagongbackdatabase;
import javaioFile;
import javaioIOException;
import javaioInputStream;
import javautilProperties;
public class BackmysqlUtil {
/
mysql数据备份 接收脚本名,并返回此路径
sql为备份的脚本名比如egsql
@throws IOException
/
public static void backup(String sqlname,String readlyPath) throws IOException {
Properties pros = getPprVue("backupproperties");
String username = prosgetProperty("username");
String password = prosgetProperty("password");
// 得到MYSQL的用户名密码后调用 mysql 的 cmd:
String databaseName = prosgetProperty("databaseName");
String address = prosgetProperty("address");
File backupath = new File(readlyPath);
if (!backupathexists()) {
backupathmkdir();
}
StringBuffer sb = new StringBuffer();
sbappend(" mysqldump ");
sbappend("--opt ");
sbappend("-h ");
sbappend(address);
sbappend(" ");
sbappend("--user=");
sbappend(username);
sbappend(" ");
sbappend("--password=");
sbappend(password);
sbappend(" ");
sbappend("--lock-all-tables=true ");
sbappend("--result-file=");
sbappend(readlyPath);
sbappend(sqlname);
sbappend(" ");
sbappend("--default-character-set=utf8 ");
sbappend(databaseName);
Runtime cmd = RuntimegetRuntime();
Process p = cmdexec(sbtoString());
prossetProperty("ss", "ss");
}
public static void load(String filename,String readlyPath) throws IOException {
Properties pros = getPprVue("backupproperties");
// 这里是读取的属性文件,也可以直接使用
String root = prosgetProperty("username");
String pass = prosgetProperty("password");
// 得到MYSQL的用户名密码后调用 mysql 的 cmd:
String filepath = readlyPath + filename; // 备份的路径地址
// 新建数据库newdb
String stmt1 = "mysqladmin -u " + root + " -p" + pass
+ " create newdb";
// -p后面加的是你的密码
String stmt2 = "mysql -u " + root + " -p" + pass + " newdb < "
+ filepath;
String[] cmd = { "cmd", "/c", stmt2 };
RuntimegetRuntime()exec(stmt1);
RuntimegetRuntime()exec(cmd);
Systemoutprintln("数据已从 " + filepath + " 导入到数据库中");
}
// 加载配置文件
public static Properties getPprVue(String properName) throws IOException {
InputStream inputStream = BackmysqlUtilclassgetClassLoader()
getResourceAsStream(properName);
Properties p = new Properties();
pload(inputStream);
inputStreamclose();
return p;
}
//测试
public static void main(String[] args) throws IOException {
backup("egsql","e:\\mysql\\");
//load("egsql","e:\\mysql\\");
}
}
配置文件:
backupproperties配置文件的内容如下,用户名和密码随便你改。
#mysqlpath = D:\\ProgramFiles\\wamp\\bin\\mysql\\mysql5132\\bin
#sqlpath = E:\\MySQl\\
username = root
password = cool
address=localhost
databaseName=huagongdb
最后你想什么时候调用直接就在程序里用一个线程控制调用就可以了。
您好,Linux MySQL的最低内存要求是256MB,但为了获得最佳性能,建议使用512MB或更多的内存。在安装Linux MySQL之前,您需要确保您的服务器上有足够的内存来满足其需求。此外,您还需要确保您的服务器上有足够的硬盘空间来安装Linux MySQL,以及足够的硬盘空间来存储您的数据库文件。
以MySQL 80 来说,通过查看 80 的官方文档得知,80 的临时表空间分为会话临时表空间和全局临时表空间,会话临时表空间存储用户创建的临时表和当 InnoDB 配置为磁盘内部临时表的存储引擎时由优化器创建的内部临时表,当会话断开连接时,其临时表空间将被截断并释放回池中;也就是说,在 80 中有一个专门的会话临时表空间,当会话被杀掉后,可以回收磁盘空间;而原来的 ibtmp1 是现在的全局临时表空间,存放的是对用户创建的临时表进行更改的回滚段,在 57 中 ibtmp1 存放的是用户创建的临时表和磁盘内部临时表;
也就是在 80 和 57 中 ibtmp1 的用途发生了变化,57 版本临时表的数据存放在 ibtmp1 中,在 80 版本中临时表的数据存放在会话临时表空间,如果临时表发生更改,更改的 undo 数据存放在 ibtmp1 中;
实验验证:将之前的查询结果保存成临时表,对应会话是 45 号,通过查看对应字典表,可知 45 号会话使用了 temp_8ibt 这个表空间,通过把查询保存成临时表,可以用到会话临时表空间,如下图:
下一步杀掉 45 号会话,发现 temp_8ibt 空间释放了,变为了初始大小,状态为非活动的,证明在 mysql80 中可以通过杀掉会话来释放临时表空间。
总结:在 mysql57 时,杀掉会话,临时表会释放,但是仅仅是在 ibtmp 文件里标记一下,空间是不会释放回 *** 作系统的。如果要释放空间,需要重启数据库;在 mysql80 中可以通过杀掉会话来释放临时表空间。
业务有两个 MySQL 集群是通过 MQ 进行同步的,昨晚 MQ 出现异常,报了很多主键冲突,想请 dba 帮忙校验一下两个集群的数据是否一致。
当接到这个需求的时候并没当回事,隐约有点印象 pt-table-checksum 能通过 dsn 实现 MySQL 的数据校验,所以当时就应承下来了。不曾想,啪啪打脸,回想起来真是草率了。
本文参考的是 pt-table-checksum 的校验逻辑,基于数据块去遍历每个表,然后比对 checksum 的值判断该块是否一致,本文主要是想聊聊我在实现数据校验脚本过程中遇到的问题以及解决思路,希望对大家有帮助。
利用线上的配置文件搭建一套主从环境。
这个用例将通过 dsn 方式连接从库。
这个用例将通过 dsn 方式连接从库,但是会将从库的复制链路 stop 掉,并清空复制信息。
熟悉 pt-table-checksum 的朋友应该都知道,该工具是基于主键(非空唯一键)进行扫描数据行,其实这个逻辑针对整型单列主键实现起来很简单,但是如果是联合主键且是字符型,好像就没那么简单了,有兴趣的可以思考一下。下面我先说一下大致的逻辑:
第一步:判断 _min_rowid 是否为空,为空就取该表的第一行,并记作 _min_rowid 。
第二步:根据 _min_rowid 作为条件进行扫描该表,取下一个数据块的数据,记录数据块的最后一行数据的主键值,记录 checksum 的值,并记下 _min_rowid 。
第三步:判断_min_rowid是否为空,非空重复第二步,为空退出检查。
通过上述三个步骤可以看到,如果是单列整型的主键,实现起来很简单,但是问题来了,业务的表的主键五花八门,有的是联合主键,有的是字符型的联合主键,还有整型+字符型的联合主键,那么上述的实现方式显然是有问题的。所以实现起来需要多考虑几个问题:
鉴于存在上述两个问题,可以参考如下实现逻辑:
假如有这么一个联合主键字段 primary key(a,b,c) 都是整型,该如何编写遍历 sql 呢?起初我的想法很简单,具体如下:
至此在编写校验脚本过程遇到的两个问题就算告一段落了,剩下的就是各种逻辑处理了,不过多赘述,有兴趣的可以自行阅读脚本文件。
本着最低程度影响业务,所以取消加锁逻辑。但是又要保证该数据块的数据一致性,如果这个数据块是个热数据,当前正在变更,那么校验的时候难免会不一致。所以只能通过多次校验实现,默认是校验20次,其中有一次校验结果是一致,就认为是一致的,如果前5次校验过程中,这个数据块的数据没有变化,也视为不一致(可能是因为延迟,也可能是真的不一致)。
pt-table-checksum 不校验表结构,改写时添加表结构的校验。
可以基于表的并行校验,可由用户指定并行数,但是脚本有个安全机制,如果用户指定的并行数大于当前 cpu 空闲核心数,就会按当前(空闲核心数-1)作为并行数。
添加网络监控,由用户指定网络上限百分比,当网卡流量超过这个百分比就暂停任务,等待网卡流量低于阈值才会继续任务。这个主要是出于对于中间件(mycat)的场景或者分布式数据库(tidb)的场景。
支持定时任务功能,用户可以使用这个功能规避业务高峰,仅在业务低峰进行数据校验。
不仅限于主从节点的校验,只要目标对象支持 MySQL 的标准 SQL 语法就能做数据校验。
校验逻辑是通过 SQL 采集目标节点的数据库,如果目标数据库系统当前存在异常,无疑是雪上加霜,将会触发未知问题,所以添加超时机制,单次取数据块的阈值是5s,超过5秒就放弃等待重试。测试发现,有时候即便触发超时了,但是 SQL 任务还是会在目标数据库的 processlist 中能看到,所以又添加了一个 kill 机制,超时后会触发一个 kill processlist id 的动作。另外为了避免 kill 错,在每个 SQL 对象添加了一个32位的 md5 值,每次 kill 的时候会校验这个 md5 值。
本工具借鉴 pt-table-checksum 工具思路改写,可以检查随意两个 mysql(支持 mysql sql 语法的数据库)节点的数据一致性。
基于主键以一个块遍历数据表,比对checksum的值,块的大小可通过参数指定。 (1)获取该表的第一个数据块的查询SQL。 (2)将两个目标节点的数据块的checksum的值,记录到临时文件,file1 file2。 (3)比对file1 file2是否一致。
第一步:先开启一个 screen 监控网络
第二步:新开启一个screen执行校验任务
(1)infolog 文件
(2)list目录
(3)md5 目录
(4)pri 目录
(5)res 目录
这是 table 目录下记录某个数据块不一致的一个例子
这是 diff 目录下记录某个数据行不一致的一个例子
(6)skiplog 文件
本工具是参考了 pt-table-checksum 工具的一些思路并结合自身经验进行改写,尚有很多不足之处,仅做学习交流之用, 如有线上环境使用需求,请在测试环境充分测试。
以上就是关于java怎么获得 mysql 当前数据库大小全部的内容,包括:java怎么获得 mysql 当前数据库大小、linuxmysql最低内存、linux怎么修改mysql数据库临时表空间大小等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)