zoukankan      html  css  js  c++  java
  • 关于增量更新云平台数据的设计思路

    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分种后的运行时间,防止多个客户端同时向服务器发起
    请求,当然,除了自动功能外,还应该提供一个手工更新功能供用户使用。

  • 相关阅读:
    error C2955: “std::xx”: 使用 类 模板 需要 模板 参数列表
    打印windows环境变量
    自动化测试覆盖率要到多少才算足够
    每个离谱的bug背后总有一个精彩绝伦的幕后故事
    测试是整个开发过程的瓶颈吗
    如何用指标去度量bug本身的质量情况
    python : 将txt文件中的数据读为numpy数组或列表
    Baxter+Kinect: Robot Teleoperation via Skeleton Tracking and Inverse Kinematics
    安卓环境和配置
    Qt开发经验小技巧181-185
  • 原文地址:https://www.cnblogs.com/littlehb/p/5125215.html
Copyright © 2011-2022 走看看