function str2Obj(str){ var data = {}; kv = str.split('&'); for(i in kv){ v = kv[i].split('='); data[v[0]] = v[1]; } return data; } function myPost(method,args,callback){ var _args = null; if (typeof(args) == 'string'){ _args = JSON.stringify(str2Obj(args)); } else { _args = JSON.stringify(args); } var loadT = layer.msg('正在获取...', { icon: 16, time: 0, shade: 0.3 }); $.post('/plugins/run', {name:'mysql', func:method, args:_args}, function(data) { layer.close(loadT); if (!data.status){ layer.msg(data.msg,{icon:0,time:2000,shade: [0.3, '#000']}); return; } if(typeof(callback) == 'function'){ callback(data); } },'json'); } function runInfo(){ myPost('run_info','',function(data){ var rdata = $.parseJSON(data.data); if (typeof(rdata['status']) != 'undefined'){ layer.msg(rdata['msg'],{icon:0,time:2000,shade: [0.3, '#000']}); return; } var cache_size = ((parseInt(rdata.Qcache_hits) / (parseInt(rdata.Qcache_hits) + parseInt(rdata.Qcache_inserts))) * 100).toFixed(2) + '%'; if (cache_size == 'NaN%') cache_size = 'OFF'; var Con = '
\ \ \ \ \ \ \
启动时间' + getLocalTime(rdata.Run) + '每秒查询' + parseInt(rdata.Questions / rdata.Uptime) + '
总连接次数' + rdata.Connections + '每秒事务' + parseInt((parseInt(rdata.Com_commit) + parseInt(rdata.Com_rollback)) / rdata.Uptime) + '
发送' + toSize(rdata.Bytes_sent) + 'File' + rdata.File + '
接收' + toSize(rdata.Bytes_received) + 'Position' + rdata.Position + '
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \
活动/峰值连接数' + rdata.Threads_running + '/' + rdata.Max_used_connections + '若值过大,增加max_connections
线程缓存命中率' + ((1 - rdata.Threads_created / rdata.Connections) * 100).toFixed(2) + '%若过低,增加thread_cache_size
索引命中率' + ((1 - rdata.Key_reads / rdata.Key_read_requests) * 100).toFixed(2) + '%若过低,增加key_buffer_size
Innodb索引命中率' + ((1 - rdata.Innodb_buffer_pool_reads / rdata.Innodb_buffer_pool_read_requests) * 100).toFixed(2) + '%若过低,增加innodb_buffer_pool_size
查询缓存命中率' + cache_size + '' + lan.soft.mysql_status_ps5 + '
创建临时表到磁盘' + ((rdata.Created_tmp_disk_tables / rdata.Created_tmp_tables) * 100).toFixed(2) + '%若过大,尝试增加tmp_table_size
已打开的表' + rdata.Open_tables + '若过大,增加table_cache_size
没有使用索引的量' + rdata.Select_full_join + '若不为0,请检查数据表的索引是否合理
没有索引的JOIN量' + rdata.Select_range_check + '若不为0,请检查数据表的索引是否合理
排序后的合并次数' + rdata.Sort_merge_passes + '若值过大,增加sort_buffer_size
锁表次数' + rdata.Table_locks_waited + '若值过大,请考虑增加您的数据库性能
' $(".soft-man-con").html(Con); }); } function myPort(){ myPost('my_port','',function(data){ var con = '
\
\ \ \
'; $(".soft-man-con").html(con); $('#btn_change_port').click(function(){ var port = $("input[name='port']").val(); myPost('set_my_port','port='+port,function(data){ var rdata = $.parseJSON(data.data); if (rdata.status){ layer.msg('修改成功!',{icon:1,time:2000,shade: [0.3, '#000']}); } else { layer.msg(rdata.msg,{icon:1,time:2000,shade: [0.3, '#000']}); } }); }); }); } //设置二进制日志 function SetBinLog() { var loadT = layer.msg(lan.public.the, { icon: 16, time: 0, shade: 0.3 }); $.post('/database?action=BinLog', "", function(rdata) { layer.close(loadT); layer.msg(rdata.msg, { icon: rdata.status ? 1 : 5 }); mysqlLog(); }); } //清空日志 function closeMySqlLog() { var loadT = layer.msg(lan.public.the, { icon: 16, time: 0, shade: 0.3 }); $.post('/database?action=GetErrorLog', "close=1", function(rdata) { layer.close(loadT); layer.msg(rdata.msg, { icon: rdata.status ? 1 : 5 }); mysqlLog(); }); } //数据库存储信置 function changeMySQLDataPath(act) { if (act != undefined) { layer.confirm(lan.soft.mysql_to_msg, { closeBtn: 2, icon: 3 }, function() { var datadir = $("#datadir").val(); var data = 'datadir=' + datadir; var loadT = layer.msg(lan.soft.mysql_to_msg1, { icon: 16, time: 0, shade: [0.3, '#000'] }); $.post('/database?action=SetDataDir', data, function(rdata) { layer.close(loadT) layer.msg(rdata.msg, { icon: rdata.status ? 1 : 5 }); }); }); return; } $.post('/database?action=GetMySQLInfo', '', function(rdata) { var LimitCon = '

\ \ \

'; $(".soft-man-con").html(LimitCon); }); } //数据库日志 function mysqlLog(act) { //获取二进制日志相关信息 $.post('/database?action=BinLog', "status=1", function(rdata) { var limitCon = '

\ ' + lan.soft.mysql_log_bin + ' ' + ToSize(rdata.msg) + '\ \

' + lan.soft.mysql_log_err + '

\ \

' $(".soft-man-con").html(limitCon); //获取错误日志 $.post('/database?action=GetErrorLog', "", function(error_body) { if (error_body.status === false) { layer.msg(error_body.msg, { icon: 5 }); error_body = lan.soft.mysql_log_ps1; } if (error_body == "") error_body = lan.soft.mysql_log_ps1; $("#error_log").text(error_body); var ob = document.getElementById('error_log'); ob.scrollTop = ob.scrollHeight; }); }); } //数据库配置状态 function myPerfOpt() { //获取MySQL配置 myPost('db_status','',function(data){ var rdata = $.parseJSON(data.data); // console.log(rdata); var key_buffer_size = toSizeM(rdata.mem.key_buffer_size); var query_cache_size = toSizeM(rdata.mem.query_cache_size); var tmp_table_size = toSizeM(rdata.mem.tmp_table_size); var innodb_buffer_pool_size = toSizeM(rdata.mem.innodb_buffer_pool_size); var innodb_additional_mem_pool_size = toSizeM(rdata.mem.innodb_additional_mem_pool_size); var innodb_log_buffer_size = toSizeM(rdata.mem.innodb_log_buffer_size); var sort_buffer_size = toSizeM(rdata.mem.sort_buffer_size); var read_buffer_size = toSizeM(rdata.mem.read_buffer_size); var read_rnd_buffer_size = toSizeM(rdata.mem.read_rnd_buffer_size); var join_buffer_size = toSizeM(rdata.mem.join_buffer_size); var thread_stack = toSizeM(rdata.mem.thread_stack); var binlog_cache_size = toSizeM(rdata.mem.binlog_cache_size); var a = key_buffer_size + query_cache_size + tmp_table_size + innodb_buffer_pool_size + innodb_additional_mem_pool_size + innodb_log_buffer_size; var b = sort_buffer_size + read_buffer_size + read_rnd_buffer_size + join_buffer_size + thread_stack + binlog_cache_size; var memSize = a + rdata.mem.max_connections * b; var memCon = '
\
最大使用内存: \ \ ' + lan.soft.mysql_set_maxmem + ': MB\
\

key_buffer_sizeMB, ' + lan.soft.mysql_set_key_buffer_size + '

\

query_cache_sizeMB, ' + lan.soft.mysql_set_query_cache_size + '

\

tmp_table_sizeMB, ' + lan.soft.mysql_set_tmp_table_size + '

\

innodb_buffer_pool_sizeMB, ' + lan.soft.mysql_set_innodb_buffer_pool_size + '

\

innodb_log_buffer_sizeMB, ' + lan.soft.mysql_set_innodb_log_buffer_size + '

\

innodb_additional_mem_pool_sizeMB

\

sort_buffer_sizeKB * ' + lan.soft.mysql_set_conn + ', ' + lan.soft.mysql_set_sort_buffer_size + '

\

read_buffer_sizeKB * ' + lan.soft.mysql_set_conn + ', ' + lan.soft.mysql_set_read_buffer_size + '

\

read_rnd_buffer_sizeKB * ' + lan.soft.mysql_set_conn + ', ' + lan.soft.mysql_set_read_rnd_buffer_size + '

\

join_buffer_sizeKB * ' + lan.soft.mysql_set_conn + ', ' + lan.soft.mysql_set_join_buffer_size + '

\

thread_stackKB * ' + lan.soft.mysql_set_conn + ', ' + lan.soft.mysql_set_thread_stack + '

\

binlog_cache_sizeKB * ' + lan.soft.mysql_set_conn + ', ' + lan.soft.mysql_set_binlog_cache_size + '

\

thread_cache_size ' + lan.soft.mysql_set_thread_cache_size + '

\

table_open_cache ' + lan.soft.mysql_set_table_open_cache + '

\

max_connections ' + lan.soft.mysql_set_max_connections + '

\
\
' $(".soft-man-con").html(memCon); $(".conf_p input[name*='size'],.conf_p input[name='max_connections'],.conf_p input[name='thread_stack']").change(function() { comMySqlMem(); }); $(".conf_p select[name='mysql_set']").change(function() { mySQLMemOpt($(this).val()); comMySqlMem(); }); }); } function reBootMySqld(){ pluginOpService('mysql','restart',''); } //设置MySQL配置参数 function setMySQLConf() { $.post('/system/system_total', '', function(memInfo) { var memSize = memInfo['memTotal']; var setSize = parseInt($("input[name='memSize']").val()); if(memSize < setSize){ var errMsg = "错误,内存分配过高!

物理内存: {1}MB
最大使用内存: {2}MB
可能造成的后果: 导致数据库不稳定,甚至无法启动MySQLd服务!"; var msg = errMsg.replace('{1}',memSize).replace('{2}',setSize); layer.msg(msg,{icon:2,time:5000}); return; } var query_cache_size = parseInt($("input[name='query_cache_size']").val()); var query_cache_type = 0; if (query_cache_size > 0) { query_cache_type = 1; } var data = { key_buffer_size: parseInt($("input[name='key_buffer_size']").val()), query_cache_size: query_cache_size, query_cache_type: query_cache_type, tmp_table_size: parseInt($("input[name='tmp_table_size']").val()), max_heap_table_size: parseInt($("input[name='tmp_table_size']").val()), innodb_buffer_pool_size: parseInt($("input[name='innodb_buffer_pool_size']").val()), innodb_log_buffer_size: parseInt($("input[name='innodb_log_buffer_size']").val()), sort_buffer_size: parseInt($("input[name='sort_buffer_size']").val()), read_buffer_size: parseInt($("input[name='read_buffer_size']").val()), read_rnd_buffer_size: parseInt($("input[name='read_rnd_buffer_size']").val()), join_buffer_size: parseInt($("input[name='join_buffer_size']").val()), thread_stack: parseInt($("input[name='thread_stack']").val()), binlog_cache_size: parseInt($("input[name='binlog_cache_size']").val()), thread_cache_size: parseInt($("input[name='thread_cache_size']").val()), table_open_cache: parseInt($("input[name='table_open_cache']").val()), max_connections: parseInt($("input[name='max_connections']").val()) }; myPost('set_db_status', data, function(data){ var rdata = $.parseJSON(data.data); showMsg(rdata.msg,function(){ reBootMySqld(); },{ icon: rdata.status ? 1 : 2 }); }); },'json'); } //MySQL内存优化方案 function mySQLMemOpt(opt) { var query_size = parseInt($("input[name='query_cache_size']").val()); switch (opt) { case '0': $("input[name='key_buffer_size']").val(8); if (query_size) $("input[name='query_cache_size']").val(4); $("input[name='tmp_table_size']").val(8); $("input[name='innodb_buffer_pool_size']").val(16); $("input[name='sort_buffer_size']").val(256); $("input[name='read_buffer_size']").val(256); $("input[name='read_rnd_buffer_size']").val(128); $("input[name='join_buffer_size']").val(128); $("input[name='thread_stack']").val(256); $("input[name='binlog_cache_size']").val(32); $("input[name='thread_cache_size']").val(4); $("input[name='table_open_cache']").val(32); $("input[name='max_connections']").val(500); break; case '1': $("input[name='key_buffer_size']").val(128); if (query_size) $("input[name='query_cache_size']").val(64); $("input[name='tmp_table_size']").val(64); $("input[name='innodb_buffer_pool_size']").val(256); $("input[name='sort_buffer_size']").val(768); $("input[name='read_buffer_size']").val(768); $("input[name='read_rnd_buffer_size']").val(512); $("input[name='join_buffer_size']").val(1024); $("input[name='thread_stack']").val(256); $("input[name='binlog_cache_size']").val(64); $("input[name='thread_cache_size']").val(64); $("input[name='table_open_cache']").val(128); $("input[name='max_connections']").val(100); break; case '2': $("input[name='key_buffer_size']").val(256); if (query_size) $("input[name='query_cache_size']").val(128); $("input[name='tmp_table_size']").val(384); $("input[name='innodb_buffer_pool_size']").val(384); $("input[name='sort_buffer_size']").val(768); $("input[name='read_buffer_size']").val(768); $("input[name='read_rnd_buffer_size']").val(512); $("input[name='join_buffer_size']").val(2048); $("input[name='thread_stack']").val(256); $("input[name='binlog_cache_size']").val(64); $("input[name='thread_cache_size']").val(96); $("input[name='table_open_cache']").val(192); $("input[name='max_connections']").val(200); break; case '3': $("input[name='key_buffer_size']").val(384); if (query_size) $("input[name='query_cache_size']").val(192); $("input[name='tmp_table_size']").val(512); $("input[name='innodb_buffer_pool_size']").val(512); $("input[name='sort_buffer_size']").val(1024); $("input[name='read_buffer_size']").val(1024); $("input[name='read_rnd_buffer_size']").val(768); $("input[name='join_buffer_size']").val(2048); $("input[name='thread_stack']").val(256); $("input[name='binlog_cache_size']").val(128); $("input[name='thread_cache_size']").val(128); $("input[name='table_open_cache']").val(384); $("input[name='max_connections']").val(300); break; case '4': $("input[name='key_buffer_size']").val(512); if (query_size) $("input[name='query_cache_size']").val(256); $("input[name='tmp_table_size']").val(1024); $("input[name='innodb_buffer_pool_size']").val(1024); $("input[name='sort_buffer_size']").val(2048); $("input[name='read_buffer_size']").val(2048); $("input[name='read_rnd_buffer_size']").val(1024); $("input[name='join_buffer_size']").val(4096); $("input[name='thread_stack']").val(384); $("input[name='binlog_cache_size']").val(192); $("input[name='thread_cache_size']").val(192); $("input[name='table_open_cache']").val(1024); $("input[name='max_connections']").val(400); break; case '5': $("input[name='key_buffer_size']").val(1024); if (query_size) $("input[name='query_cache_size']").val(384); $("input[name='tmp_table_size']").val(2048); $("input[name='innodb_buffer_pool_size']").val(4096); $("input[name='sort_buffer_size']").val(4096); $("input[name='read_buffer_size']").val(4096); $("input[name='read_rnd_buffer_size']").val(2048); $("input[name='join_buffer_size']").val(8192); $("input[name='thread_stack']").val(512); $("input[name='binlog_cache_size']").val(256); $("input[name='thread_cache_size']").val(256); $("input[name='table_open_cache']").val(2048); $("input[name='max_connections']").val(500); break; } } //计算MySQL内存开销 function comMySqlMem() { var key_buffer_size = parseInt($("input[name='key_buffer_size']").val()); var query_cache_size = parseInt($("input[name='query_cache_size']").val()); var tmp_table_size = parseInt($("input[name='tmp_table_size']").val()); var innodb_buffer_pool_size = parseInt($("input[name='innodb_buffer_pool_size']").val()); var innodb_additional_mem_pool_size = parseInt($("input[name='innodb_additional_mem_pool_size']").val()); var innodb_log_buffer_size = parseInt($("input[name='innodb_log_buffer_size']").val()); var sort_buffer_size = $("input[name='sort_buffer_size']").val() / 1024; var read_buffer_size = $("input[name='read_buffer_size']").val() / 1024; var read_rnd_buffer_size = $("input[name='read_rnd_buffer_size']").val() / 1024; var join_buffer_size = $("input[name='join_buffer_size']").val() / 1024; var thread_stack = $("input[name='thread_stack']").val() / 1024; var binlog_cache_size = $("input[name='binlog_cache_size']").val() / 1024; var max_connections = $("input[name='max_connections']").val(); var a = key_buffer_size + query_cache_size + tmp_table_size + innodb_buffer_pool_size + innodb_additional_mem_pool_size + innodb_log_buffer_size var b = sort_buffer_size + read_buffer_size + read_rnd_buffer_size + join_buffer_size + thread_stack + binlog_cache_size var memSize = a + max_connections * b $("input[name='memSize']").val(memSize.toFixed(2)); } function syncGetDatabase(){ myPost('sync_get_databases', null, function(data){ var rdata = $.parseJSON(data.data); showMsg(rdata.msg,function(){ dbList(); },{ icon: rdata.status ? 1 : 2 }); }); } function setRootPwd(type, pwd){ if (type==1){ var data = $("#mod_pwd").serialize(); myPost('set_root_pwd', data, function(data){ var rdata = $.parseJSON(data.data); // console.log(rdata); showMsg(rdata.msg,function(){ dbList(); $('.layui-layer-close1').click(); },{icon: rdata.status ? 1 : 2}); }); return; } var index = layer.open({ type: 1, skin: 'demo-class', area: '500px', title: '修改数据库密码', closeBtn: 1, shift: 5, shadeClose: true, content: "

\
\ root密码\
\
\
\ \ \
\
", }); $('#my_mod_close').click(function(){ $('.layui-layer-close1').click(); }); } function showHidePass(obj){ var a = "glyphicon-eye-open"; var b = "glyphicon-eye-close"; if($(obj).hasClass(a)){ $(obj).removeClass(a).addClass(b); $(obj).prev().text($(obj).prev().attr('data-pw')) } else{ $(obj).removeClass(b).addClass(a); $(obj).prev().text('***'); } } function copyPass(password){ var clipboard = new ClipboardJS('#bt_copys'); clipboard.on('success', function (e) { bt.msg({msg:'复制成功',icon:1}); }); clipboard.on('error', function (e) { bt.msg({msg:'复制失败,浏览器不兼容!',icon:2}); }); $("#bt_copys").attr('data-clipboard-text',password); $("#bt_copys").click(); } function setDbPass(id, username, password){ var index = layer.open({ type: 1, skin: 'demo-class', area: '500px', title: '修改数据库密码', closeBtn: 1, shift: 5, shadeClose: true, content: "
\
\ 用户名\
\
\
\ 密码\
\
\
\ \ \
\
", }); $('#my_mod_close').click(function(){ $('.layui-layer-close1').click(); }); $('#my_mod_save').click(function(){ var data = $("#mod_pwd").serialize(); console.log(data); // myPost('set_root_pwd', data, function(data){ // var rdata = $.parseJSON(data.data); // // console.log(rdata); // showMsg(rdata.msg,function(){ // dbList(); // $('.layui-layer-close1').click(); // },{icon: rdata.status ? 1 : 2}); // }); }); } function addDatabase(type){ if (type==1){ var data = $("#add_db").serialize(); data = decodeURIComponent(data); var dataObj = str2Obj(data); if(!dataObj['address']){ dataObj['address'] = dataObj['dataAccess']; } myPost('add_db', dataObj, function(data){ var rdata = $.parseJSON(data.data); showMsg(rdata.msg,function(){ if (rdata.status){ dbList(); } $('.layui-layer-close1').click(); },{icon: rdata.status ? 1 : 2},600); }); return; } var index = layer.open({ type: 1, skin: 'demo-class', area: '500px', title: '添加数据库', closeBtn: 1, shift: 5, shadeClose: true, content: "
\
\ 数据库名\
\ \
\
\
用户名
\
\ 密码\
\
\
\ 访问权限\
\ \
\
\ \
\ \ \
\
", }); $("input[name='name']").keyup(function(){ var v = $(this).val(); $("input[name='db_user']").val(v); $("input[name='ps']").val(v); }); $('#my_mod_close').click(function(){ $('.layui-layer-close1').click(); }); $('select[name="dataAccess"]').change(function(){ var v = $(this).val(); if (v == 'ip'){ $(this).after(""); } else { $('#dataAccess_subid').remove(); } }); } function delDb(id, name){ safeMessage('删除['+name+']','您真的要删除['+name+']吗?',function(){ var data='id='+id+'&name='+name myPost('del_db', data, function(data){ var rdata = $.parseJSON(data.data); showMsg(rdata.msg,function(){ dbList(); $('.layui-layer-close1').click(); },{icon: rdata.status ? 1 : 2},1000); }); }); } function openPhpmyadmin(name,username,password){ data = syncPost('/plugins/check',{'name':'phpmyadmin'}); if (!data.status){ layer.msg(data.msg,{icon:2,shade: [0.3, '#000']}); return; } data = syncPost('/plugins/run',{'name':'phpmyadmin','func':'status'}); if (data.data != 'start'){ layer.msg('phpMyAdmin未启动',{icon:2,shade: [0.3, '#000']}); return; } data = syncPost('/plugins/run',{'name':'phpmyadmin','func':'get_home_page'}); var rdata = $.parseJSON(data.data); if (!rdata.status){ layer.msg(rdata.msg,{icon:2,shade: [0.3, '#000']}); return; } $("#toPHPMyAdmin").attr('action',rdata.data); if($("#toPHPMyAdmin").attr('action').indexOf('phpmyadmin') == -1){ layer.msg('请先安装phpMyAdmin',{icon:2,shade: [0.3, '#000']}); setTimeout(function(){ window.location.href = '/soft'; },3000); return; } var murl = $("#toPHPMyAdmin").attr('action'); $("#pma_username").val(username); $("#pma_password").val(password); $("#db").val(name); layer.msg('正在打开phpMyAdmin',{icon:16,shade: [0.3, '#000'],time:1000}); setTimeout(function(){ $("#toPHPMyAdmin").submit(); },200); } function dbList(page, search){ var _data = {}; if (typeof(page) =='undefined'){ var page = 1; } _data['page'] = page; _data['page_size'] = 10; if(typeof(search) != 'undefined'){ _data['search'] = search; } myPost('get_db_list', _data, function(data){ var rdata = $.parseJSON(data.data); // console.log(rdata); var list = ''; for(i in rdata.data){ // console.log(i, rdata.data[i]); list += ''; list +=''; list += '' + rdata.data[i]['name'] +''; list += '' + rdata.data[i]['username'] +''; list += '' + '***' + ''+ ''+ ''; list += '备份'; list += ''+rdata.data[i]['ps']+''; list += '' + '管理 | ' + '工具 | ' + '权限 | ' + '改密 | ' + '删除' + ''; list += ''; } var con = '
\ \ \ \ \ \ \ \
\
\ \ \ \ \ \ \ \ \ '+ list +'\
数据库名用户名密码备份备注操作
\
\
\
\ 同步选中\ 同步所有\ 从服务器获取\
\
\
'; con += ''; $(".soft-man-con").html(con); $('#databasePage').html(rdata.page); }); }