/// <summary> /// 安裝並開啟服務 /// </summary> public static bool InitAndStartService(string serviceName, string mysqliniPath, string mysqlPath, string mysqlBinPath, string mysqlDataPath) { try { A_InitDataBase(mysqlBinPath); B_ResetMySqlConfig(mysqliniPath, mysqlPath, mysqlDataPath); C_InstallService(mysqlBinPath, serviceName, mysqliniPath); D_StartService(serviceName); E_SetDefaultPassword(mysqliniPath, api.MySqlPassword); } catch (Exception ex) { api.logger.addToLog(ex, "InitAndStartService方法出錯!"); return false; } return true; } /// <summary> /// 初始化數據庫,如果已經發生過初始化,則不會再初始化,注意,初始化完成后是空密碼。 /// </summary> /// <param name="mysqlBinPath"></param> /// <returns></returns> public static void A_InitDataBase(string mysqlBinPath) { if (!Directory.Exists(api.MysqlDataPath)) { try { Directory.CreateDirectory(api.MysqlDataPath); } catch { } } //新建初始數據庫 var log = exec.RunCmd(mysqlBinPath, "mysqld --initialize-insecure --console").Trim();//--user=mysql api.logger.addToLog("A_InitDataBase方法日志:\r\n" + log); } /// <summary> /// 配置數據庫ini文件,在初始化之后,啟動服務之前調用。 /// </summary> public static void B_ResetMySqlConfig(string mysqlIniPath, string mysqlPath, string mysqlDataPath) { IniHelper ini = new IniHelper(mysqlIniPath); ini.Write("mysqld", "basedir", (mysqlPath + "").TrimEnd('\\')); ini.Write("mysqld", "datadir", (mysqlDataPath + "").TrimEnd('\\')); } /// <summary> /// 安裝服務,會執行卸載再裝。 /// </summary> public static void C_InstallService(string mysqlBinPath, string serviceName, string mysqliniPath) { exec.RunCmd(mysqlBinPath, string.Format("mysqld.exe -remove {0}", serviceName)); var log = exec.RunCmd(mysqlBinPath, string.Format("mysqld.exe -install {0} --defaults-file=\"{1}\"", serviceName, mysqliniPath)); api.logger.addToLog("C_InstallService方法日志:\r\n" + log); } /// <summary> /// 啟動服務 /// </summary> public static bool D_StartService(string serviceName) { //return Cocon90.Lib.Util.Window.Service.ServiceHelper.StartService(serviceName, TimeSpan.FromSeconds(10));//開啟服務 try { ServiceController[] services = ServiceController.GetServices(); ServiceController service = services.Where(p => p.ServiceName == serviceName).FirstOrDefault(); if (service == null) return false; service.Start(); service.WaitForStatus(ServiceControllerStatus.Running, TimeSpan.FromSeconds(10)); return service.Status == ServiceControllerStatus.Running; } catch (Exception ex) { api.logger.addToLog(ex, "D_StartService方法出錯:"); return false; } } /// <summary> /// 設置初始密碼。將空密碼修改為指定密碼。 /// </summary> public static bool E_SetDefaultPassword(string mysqliniPath, string newPassword) { var port = GetDbPort(mysqliniPath); return sql.SetDefaultPassword(port, "", newPassword); } /// <summary> /// 檢測數據庫是否存在(或者已初始化過) /// </summary> public static bool GetIsDbFileExisted(string mysqlDataPath) { return !(!Directory.Exists(mysqlDataPath) || Directory.GetFiles(mysqlDataPath).Length == 0 || !Directory.Exists(Path.Combine(mysqlDataPath, "mysql"))); //檢查目錄下有無文件,或數據目錄下有無mysql文件夾 //if (ifNotExistIsInit) //{ // //新建初始數據庫 // string log = exec.RunCmd(mysqlBinPath, "mysqld --initialize-insecure --user=mysql --console").Trim(); // if (log.Length > 12) // { // //獲得初始密碼 // initPassword = log.Substring(log.Length - 12, 12); // } //} } /// <summary> /// 獲取當前端口 /// </summary> public static string GetDbPort(string mysqlIniPath) { IniHelper ini = new IniHelper(mysqlIniPath); return ini.Read("mysqld", "port"); }
public static bool SetDefaultPassword(object port, object initPassword, string newPassword) { string connStr = string.Format("server=localhost;user=root;port={0};password='{1}';logging=true;", port, initPassword); MySqlConnection conn = new MySqlConnection(connStr); try { conn.Open(); var command = new MySqlCommand(string.Format("alter user 'root'@'localhost' identified by '{0}';", newPassword), conn); var eff = command.ExecuteNonQuery(); conn.Close(); return true; } catch (Exception ex) { conn.Close(); return false; } }