From 9b8cfe7fc104adbd37d470952dfadf5359815532 Mon Sep 17 00:00:00 2001 From: Mr Chen Date: Tue, 15 Jan 2019 12:59:56 +0800 Subject: [PATCH] =?UTF-8?q?mysql=20=E5=B7=A5=E5=85=B7=E5=8A=9F=E8=83=BDok?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/mysql/index.html | 24 ++++++ plugins/mysql/index.py | 79 ++++++++++++++++++ plugins/mysql/js/mysql.js | 169 +++++++++++++++++++++++++++++++++++--- 3 files changed, 262 insertions(+), 10 deletions(-) diff --git a/plugins/mysql/index.html b/plugins/mysql/index.html index dd5e4f605..104612b6a 100755 --- a/plugins/mysql/index.html +++ b/plugins/mysql/index.html @@ -1,5 +1,29 @@
diff --git a/plugins/mysql/index.py b/plugins/mysql/index.py index 906ec764f..b4c567049 100755 --- a/plugins/mysql/index.py +++ b/plugins/mysql/index.py @@ -855,6 +855,79 @@ def getDbInfo(): return public.getJson(ret) +def repairTable(): + args = getArgs() + data = checkArgs(args, ['db_name', 'tables']) + if not data[0]: + return data[1] + + db_name = args['db_name'] + tables = json.loads(args['tables']) + pdb = pMysqlDb() + mysql_table = mapToList(pdb.query('show tables from `%s`' % db_name)) + ret = [] + if type(mysql_table) == list: + if len(mysql_table) > 0: + for i in mysql_table: + for i2 in tables: + if i2 == i[0]: + ret.append(i2) + if len(ret) > 0: + for i in ret: + pdb.execute('REPAIR TABLE `%s`.`%s`' % (db_name, i)) + return public.returnJson(True, "修复完成!") + return public.returnJson(False, "修复失败!") + + +def optTable(): + args = getArgs() + data = checkArgs(args, ['db_name', 'tables']) + if not data[0]: + return data[1] + + db_name = args['db_name'] + tables = json.loads(args['tables']) + pdb = pMysqlDb() + mysql_table = mapToList(pdb.query('show tables from `%s`' % db_name)) + ret = [] + if type(mysql_table) == list: + if len(mysql_table) > 0: + for i in mysql_table: + for i2 in tables: + if i2 == i[0]: + ret.append(i2) + if len(ret) > 0: + for i in ret: + pdb.execute('OPTIMIZE TABLE `%s`.`%s`' % (db_name, i)) + return public.returnJson(True, "优化成功!") + return public.returnJson(False, "优化失败或者已经优化过了!") + + +def alterTable(): + args = getArgs() + data = checkArgs(args, ['db_name', 'tables']) + if not data[0]: + return data[1] + + db_name = args['db_name'] + tables = json.loads(args['tables']) + table_type = args['table_type'] + pdb = pMysqlDb() + mysql_table = mapToList(pdb.query('show tables from `%s`' % db_name)) + ret = [] + if type(mysql_table) == list: + if len(mysql_table) > 0: + for i in mysql_table: + for i2 in tables: + if i2 == i[0]: + ret.append(i2) + if len(ret) > 0: + for i in ret: + pdb.execute('alter table `%s`.`%s` ENGINE=`%s`' % + (db_name, i, table_type)) + return public.returnJson(True, "更改成功!") + return public.returnJson(False, "更改失败!") + if __name__ == "__main__": func = sys.argv[1] if func == 'status': @@ -913,5 +986,11 @@ if __name__ == "__main__": print setDbAccess() elif func == 'get_db_info': print getDbInfo() + elif func == 'repair_table': + print repairTable() + elif func == 'opt_table': + print optTable() + elif func == 'alter_table': + print alterTable() else: print 'error' diff --git a/plugins/mysql/js/mysql.js b/plugins/mysql/js/mysql.js index 621605d03..afc6c6030 100755 --- a/plugins/mysql/js/mysql.js +++ b/plugins/mysql/js/mysql.js @@ -8,7 +8,7 @@ function str2Obj(str){ return data; } -function myPost(method,args,callback){ +function myPost(method,args,callback, title){ var _args = null; if (typeof(args) == 'string'){ @@ -17,7 +17,12 @@ function myPost(method,args,callback){ _args = JSON.stringify(args); } - var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 }); + var _title = '正在获取...'; + if (typeof(title) != 'undefined'){ + _title = title; + } + + var loadT = layer.msg(_title, { icon: 16, time: 0, shade: 0.3 }); $.post('/plugins/run', {name:'mysql', func:method, args:_args}, function(data) { layer.close(loadT); if (!data.status){ @@ -863,14 +868,6 @@ function openPhpmyadmin(name,username,password){ },200); } -function repTools(dbname){ - console.log(dbname); - myPost('get_db_info', {name:dbname}, function(data){ - console.log(data); - var rdata = $.parseJSON(data.data); - console.log(rdata); - }); -} function dbList(page, search){ var _data = {}; @@ -1004,3 +1001,155 @@ function myLogs(){ }); }); } + + +function repCheckeds(tables) { + var dbs = [] + if (tables) { + dbs.push(tables) + } else { + var db_tools = $("input[value^='dbtools_']"); + for (var i = 0; i < db_tools.length; i++) { + if (db_tools[i].checked) dbs.push(db_tools[i].value.replace('dbtools_', '')); + } + } + + if (dbs.length < 1) { + layer.msg('请至少选择一张表!', { icon: 2 }); + return false; + } + return dbs; +} + +function repDatabase(db_name, tables) { + dbs = repCheckeds(tables); + + myPost('repair_table', { db_name: db_name, tables: JSON.stringify(dbs) }, function(data){ + var rdata = $.parseJSON(data.data); + layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 }); + repTools(db_name, true); + },'已送修复指令,请稍候...'); +} + + +function optDatabase(db_name, tables) { + dbs = repCheckeds(tables); + + myPost('opt_table', { db_name: db_name, tables: JSON.stringify(dbs) }, function(data){ + var rdata = $.parseJSON(data.data); + layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 }); + repTools(db_name, true); + },'已送优化指令,请稍候...'); +} + +function toDatabaseType(db_name, tables, type){ + dbs = repCheckeds(tables); + myPost('alter_table', { db_name: db_name, tables: JSON.stringify(dbs),table_type: type }, function(data){ + var rdata = $.parseJSON(data.data); + layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 }); + repTools(db_name, true); + }, '已送引擎转换指令,请稍候...'); +} + + +function selectedTools(my_obj, db_name) { + var is_checked = false + + if (my_obj) is_checked = my_obj.checked; + var db_tools = $("input[value^='dbtools_']"); + var n = 0; + for (var i = 0; i < db_tools.length; i++) { + if (my_obj) db_tools[i].checked = is_checked; + if (db_tools[i].checked) n++; + } + if (n > 0) { + var my_btns = '\ + \ + \ + ' + $("#db_tools").html(my_btns); + } else { + $("#db_tools").html(''); + } +} + +function repTools(db_name, res){ + myPost('get_db_info', {name:db_name}, function(data){ + var rdata = $.parseJSON(data.data); + var types = { InnoDB: "MyISAM", MyISAM: "InnoDB" }; + var tbody = ''; + for (var i = 0; i < rdata.tables.length; i++) { + if (!types[rdata.tables[i].type]) continue; + tbody += '\ + \ + ' + rdata.tables[i].table_name + '\ + ' + rdata.tables[i].type + '\ + ' + rdata.tables[i].collation + '\ + ' + rdata.tables[i].rows_count + '\ + ' + rdata.tables[i].data_size + '\ + \ + 修复 |\ + 优化 |\ + 转为' + types[rdata.tables[i].type] + '\ + \ + ' + } + + if (res) { + $(".gztr").html(tbody); + $("#db_tools").html(''); + $("input[type='checkbox']").attr("checked", false); + $(".tools_size").html('大小:' + rdata.data_size); + return; + } + + layer.open({ + type: 1, + title: "MySQL工具箱【" + db_name + "】", + area: ['780px', '580px'], + closeBtn: 2, + shadeClose: false, + content: '
\ + \ +
\ +
\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + ' + tbody + '\ +
表名引擎字符集行数大小操作
\ +
\ +
\ +
    \ +
  • 【修复】尝试使用REPAIR命令修复损坏的表,仅能做简单修复,若修复不成功请考虑使用myisamchk工具
  • \ +
  • 【优化】执行OPTIMIZE命令,可回收未释放的磁盘空间,建议每月执行一次
  • \ +
  • 【转为InnoDB/MyISAM】转换数据表引擎,建议将所有表转为InnoDB
  • \ +
' + }); + tableFixed('database_fix'); + //表格头固定 + function tableFixed(name) { + var tableName = document.querySelector('#' + name); + tableName.addEventListener('scroll', scrollHandle); + } + + function scrollHandle(e) { + var scrollTop = this.scrollTop; + //this.querySelector('thead').style.transform = 'translateY(' + scrollTop + 'px)'; + $(this).find("thead").css({ "transform": "translateY(" + scrollTop + "px)", "position": "relative", "z-index": "1" }); + } + }); +}