• 关于增量更新云平台数据的设计思路


    1、使用mysqldump进行增量文件备份

    附一下以前完成的C#版代码示例:

     /// <summary>
            /// 功能:导出数据
            /// 作者:黄海
            /// 时间:2015-09-24
            /// </summary>
            /// <param name="host"></param>
            /// <param name="port"></param>
            /// <param name="user"></param>
            /// <param name="passWord"></param>
            /// <param name="dataBaseName"></param>
            /// <param name="tableName"></param>
            /// <param name="condition"></param>
            /// <param name="dirName"></param>
            private static void ExportData(String host, String port, String user, String passWord, String dataBaseName, String tableName, String condition, String dirName)
            {
                var fileName = Application.StartupPath + "\mysqldump.exe";
                //  var arguments = " -h " + host + " -P" + port + " -u" + user + " -p" + passWord + " --compact -t " + dataBaseName + " " + tableName + " --where="" + condition + "" > "" + dirName + "\" + tableName + ".sql"";
                var arguments = " -h " + host + " -P" + port + " -u" + user + " -p" + passWord + "  --no-create-info --compact --skip-extended-insert  " + dataBaseName + " " + tableName + " --where="" + condition + "" > "" + dirName + "\" + tableName + ".sql"";
    
                var psi = new ProcessStartInfo("cmd.exe")
                {
                    Arguments = "/c  ("" + fileName + "" " + arguments + ")",
                    WorkingDirectory = Application.StartupPath,
                    RedirectStandardOutput = true,
                    UseShellExecute = false,
                    CreateNoWindow = true
                };
                var p = Process.Start(psi);
                var output = p.StandardOutput.ReadToEnd();
                p.WaitForExit();
            }


    2、如何使用java 调用mysqldump?  
    http://cnhnslhs-163-com.iteye.com/blog/1774508
    http://blog.csdn.net/icejadelove/article/details/4966317

    大约的代码示例是这样的:

    public static void backup() {
    try {
         Runtime rt = Runtime.getRuntime();
    
         Process child = rt.exec("mysqldump -u用户名 -p密码 -R -c --set-charset=utf8 数据库名");
    
         InputStream in = child.getInputStream();
    
         InputStreamReader xx = new InputStreamReader(in, "utf8");
    
         String inStr;
         StringBuffer sb = new StringBuffer("");
         String outStr;
    
         BufferedReader br = new BufferedReader(xx);
         while ((inStr = br.readLine()) != null) {
               sb.append(inStr + "
    ");
         }
         outStr = sb.toString();
    
    
         FileOutputStream fout = new FileOutputStream("备份的文件路径名");
         OutputStreamWriter writer = new OutputStreamWriter(fout, "utf8");
         writer.write(outStr);
         writer.flush();
    
         in.close();
         xx.close();
         br.close();
         writer.close();
         fout.close();
         } catch (Exception e) {
             e.printStackTrace();
         }
    
    }
    
    还原:
    public static void load() {
    try {
         String fPath = "备份的文件路径名";
         Runtime rt = Runtime.getRuntime();
    
         Process child = rt.exec("mysql -u用户名 -p密码 数据库名");
         OutputStream out = child.getOutputStream();
         String inStr;
         StringBuffer sb = new StringBuffer("");
         String outStr;
         BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(fPath), "utf8"));
         while ((inStr = br.readLine()) != null) {
             sb.append(inStr + "
    ");
         }
         outStr = sb.toString();
    
         OutputStreamWriter writer = new OutputStreamWriter(out, "utf8");
         writer.write(outStr);
         writer.flush();
    
         out.close();
         br.close();
         writer.close();
         } catch (Exception e) {
             e.printStackTrace();
         }
    } 



    3、生成的是一个文件,返回的是OK和文件路径,然后C#去下载这个文件并执行import动作。

     private static void ImportData(String host, String port, String user, String passWord, String dataBaseName, String dirName)
            {
                var di = new DirectoryInfo(dirName);
                foreach (var o in di.GetFiles())
                {
                    if (o.Extension == ".sql")
                    {
                        var fileName = Application.StartupPath + "\mysql.exe";
                        var arguments = " -h " + host + " -P" + port + " -u" + user + " -p" + passWord + " " + dataBaseName + " < "" + o.FullName + "" --default-character-set=utf8";
                        var psi = new ProcessStartInfo("cmd.exe")
                        {
                            Arguments = "/c  ("" + fileName + "" " + arguments + ")",
                            WorkingDirectory = Application.StartupPath,
                            RedirectStandardOutput = true,
                            UseShellExecute = false,
                            CreateNoWindow = true
                        };
                        var p = Process.Start(psi);
                        var output = p.StandardOutput.ReadToEnd();
                        p.WaitForExit();        
                    }
                }
            }

    4、下载成功后向服务器发起一个指令,让其删除掉这个文件,防止磁盘占用太多。


    5、根据TS的范围进行重新生成SSDB的预热信息,放弃执行索引更新,让每天的全量更新起作用。


    6、时间:建议每天晚上12点以后,每天6点以前进行

    即: 0,1,2,3,4,5共6个小时。 6*60=360分钟,建议处理程序

    abcdefg".GetHashCode().ToString("D10") 产生一个10的数字,然后除以300取余数,就是从0点开始加N分种后的运行时间,防止多个客户端同时向服务器发起
    请求,当然,除了自动功能外,还应该提供一个手工更新功能供用户使用。

  • 相关阅读:
    【JZOJ3213】【SDOI2013】直径
    【JZOJ3211】【SDOI2013】随机数生成器
    【巨人的步伐以及人类的进击】BSGS algorithm
    【JZOJ2758】【SDOI2012】走迷宫(labyrinth)
    【JZOJ4964】【GDKOI2017模拟1.21】Rhyme
    【JZOJ3875】【NOIP2014八校联考第4场第2试10.20】星球联盟(alliance)
    【JZOJ3873】【NOIP2014八校联考第4场第2试10.20】乐曲创作(music)
    【JZOJ3887】【长郡NOIP2014模拟10.22】字符串查询
    【JZOJ3886】【长郡NOIP2014模拟10.22】道路维护
    django 模版-标签-视图-csrf-token-模版继承-HTML过滤器
  • 原文地址:https://www.cnblogs.com/littlehb/p/5125215.html
Copyright © 2020-2023  润新知