浏览代码

Merge remote-tracking branch 'origin/master'

# Conflicts:
#	TRS.WCM.Developer/贵州项目6个WCM节点迁移到海云/readme.md
lijihong 6 年之前
父节点
当前提交
3a949449f5

+ 168 - 0
TRS.WCM.Developer/src/com/trs/exchange/MyScripts.java

@@ -0,0 +1,168 @@
+package com.trs.exchange;
+
+import net.sf.json.JSONObject;
+
+import java.io.*;
+
+
+/**
+ * Created by Administrator on 2019/5/14.
+ * 贵州数据迁移时用于
+ */
+public class MyScripts {
+
+    private static String city1 = "{\"toPath\":\"D:\\\\data_backup\\\\city1\\\\city1.sql\",\"u\":\"trswcm\",\"p\":\"3sDs9ds8Vsd3_sl\",\"h\":\"100.99.26.181\",\"db\":\"cmwcm_c\"}";
+    private static String city2 = "{\"toPath\":\"D:\\\\data_backup\\\\city1\\\\city1.sql\",\"u\":\"trswcm\",\"p\":\"3sDs9ds8Vsd3_sl\",\"h\":\"100.99.26.181\",\"db\":\"cmwcm_c\"}";
+    private static String city5 = "{\"toPath\":\"D:\\\\data_backup\\\\city5\\\\city5.sql\",\"u\":\"trswcm\",\"p\":\"3sDd3_sl\",\"h\":\"59.215.229.55\",\"db\":\"cmwcm_c\"}";
+
+    public static void main(String[] args) throws IOException {
+        //System.out.println(Pattern.matches("3_sp\\w+.sql","3_sp_data_migration_wcmtemplatequote.sql"));
+        String basedir = //工程下文件夹
+                "E:\\IdeaProject\\TRS.WCM.Developer_cddev\\TRS.WCM.Developer\\贵州项目6个WCM节点迁移到海云\\";
+        String toPath = "E:\\xxy\\mergeSql\\";//生成的merge.sql存放路径
+        createMergeSpScript(0,basedir,toPath);
+        createMergeSpScript(1,basedir,toPath);
+        createMergeSpScript(3,basedir,toPath);
+        createMergeSpScript(4,basedir,toPath);
+        createMasMergeSpScript(basedir,toPath);
+        /*
+        JSONObject object = JSONObject.fromObject(city5);
+        System.out.println(object);
+        createSqlDumpScript(tablesNames.split(","),object.getString("toPath"),object.getString("h"),object.getString("u"),object.getString("p"),object.getString("db"));
+        */
+    }
+
+    /**
+     * 生成 mas_merge_.sql,避免单独运行创建存储过程sql过程中遗漏
+     * @param basedir 需合并的sql根目录
+     * @param toPath 生成的sql目录
+     * @throws IOException
+     */
+    public static void createMasMergeSpScript( String basedir,String toPath) throws IOException {
+        File dir = new File(basedir);
+        File todir = new File(toPath);
+        if (!dir.isDirectory() || !todir.isDirectory()){
+            System.err.print("path:" + basedir + "is not a directory");
+            System.exit(1);
+        }
+        File mergeFile = new File(toPath  + "mas_merge.sql");
+        if (mergeFile.exists())
+            mergeFile.delete();
+        mergeFile.createNewFile();
+        BufferedWriter writer = new BufferedWriter(new FileWriter(mergeFile));
+        for (File sp_file : dir.listFiles()) {
+            if (sp_file.getName().matches( "3_sp_data_migration_mas_\\w+.sql")) {
+                System.out.println(sp_file.getName());
+                writer.newLine();
+                writer.write("-- "+sp_file.getName());
+                writer.newLine();
+                BufferedReader reader = new BufferedReader(new FileReader(sp_file));
+                while (true){
+                    String line = reader.readLine();
+                    if (null == line)
+                        break;
+                    writer.write(line);
+                    writer.newLine();
+                }
+                writer.flush();
+            }
+        }
+    }
+
+    /**
+     * 生成 x_merge_.sql,避免单独运行创建存储过程sql过程中遗漏
+     * @param type 前缀
+     * @param basedir 需合并的sql根目录
+     * @param toPath 生成的sql目录
+     * @throws IOException
+     */
+    public static void createMergeSpScript(int type , String basedir,String toPath) throws IOException {
+        File dir = new File(basedir);
+        File todir = new File(toPath);
+        if (!dir.isDirectory() || !todir.isDirectory()){
+            System.err.print("path:" + basedir + "is not a directory");
+            System.exit(1);
+        }
+        File mergeFile = new File(toPath + type + "_merge.sql");
+        if (mergeFile.exists())
+            mergeFile.delete();
+        mergeFile.createNewFile();
+        BufferedWriter writer = new BufferedWriter(new FileWriter(mergeFile));
+        for (File sp_file : dir.listFiles()) {
+            if (sp_file.getName().matches(type + "_\\w+.sql")) {
+                System.out.println(sp_file.getName());
+                writer.newLine();
+                writer.write("-- "+sp_file.getName());
+                writer.newLine();
+                BufferedReader reader = new BufferedReader(new FileReader(sp_file));
+                while (true){
+                    String line = reader.readLine();
+                    if (null == line)
+                        break;
+                    writer.write(line);
+                    writer.newLine();
+                }
+                writer.flush();
+            }
+        }
+        if (type == 3){
+            File dir2 = new File(basedir + "全量迁移");
+            for (File sp_file : dir2.listFiles()) {
+                System.out.println(sp_file.getName());
+                writer.newLine();
+                writer.write("-- "+sp_file.getName());
+                writer.newLine();
+                BufferedReader reader = new BufferedReader(new FileReader(sp_file));
+                while (true){
+                    String line = reader.readLine();
+                    if (null == line)
+                        break;
+                    writer.write(line);
+                    writer.newLine();
+                }
+                writer.flush();
+                //System.out.println(sp_file.getName());
+            }
+        }
+    }
+    /**
+     *  生成节点迁移的dumpsql
+     * @param tablesNames 需迁移的表名
+     * @param toPath 生成的路径
+     * @param h DB Host
+     * @param u DB username
+     * @param p DB password
+     */
+    public static void createSqlDumpScript(String[] tablesNames,String toPath , String h , String u, String p,String db) {
+
+        for (String tableName: tablesNames ) {
+            String script = "mysqldump -h"+h+" -u"+u+" -p"+p+" "+db+" "+tableName+" >> "+toPath;
+            System.out.println(script);
+        }
+    }
+
+
+
+
+    private static String tablesNames = "wcmappendix," +
+            "wcmchannel," +
+            "wcmchannelchildindexquote," +
+            "wcmchannelsyn,wcmchnldoc," +
+            "wcmdocument," +
+            "wcmfolderpublishconfig," +
+            "wcmtemplate," +
+            "wcmtemplateargument," +
+            "wcmtemplateemploy," +
+            "wcmtemplatenest," +
+            "wcmtemplatequote," +
+            "wcmwebsite," +
+            "xwcmclassinfo," +
+            "xwcmclassinfoview," +
+            "xwcmdbfieldinfo," +
+            "xwcmmaterial," +
+            "xwcmmetaviewemployer," +
+            "xwcmmetaviewfieldgroup," +
+            "xwcmtableinfo," +
+            "xwcmviewfieldinfo," +
+            "xwcmviewinfo";
+}

+ 1 - 1
TRS.WCM.Developer/贵州项目6个WCM节点迁移到海云/4_sp_city_data.sql

@@ -15,7 +15,7 @@ CREATE PROCEDURE sp_city_data(IN n INT)
     SET @prevRecId = ifnull((SELECT prev_id from data_migration_log where table_name = 'wcmchnldoc'), 0);
     SET @prevDocId = ifnull((SELECT prev_id from data_migration_log where table_name = 'wcmdocument'), 0);
     SET @prevClassInfoViewId = ifnull((SELECT prev_id from data_migration_log where table_name = 'xwcmclassinfoview'), 0);
-    SET @prevTableInfoId = ifnull(SELECT max(start_id) FROM data_migration_offset WHERE table_name = 'xwcmtableinfo'), 0);
+    SET @prevTableInfoId = ifnull((SELECT max(start_id) FROM data_migration_offset WHERE table_name = 'xwcmtableinfo'), 0);
 
     # 支持数据增量 偏移量  修改
     # xx ID 偏移量,获取海云系统中的对应 xx maxID 错开一段距离,改为存入最大id

+ 94 - 30
TRS.WCM.Developer/贵州项目6个WCM节点迁移到海云/readme.md

@@ -1,13 +1,57 @@
+> 中间库说明:
+> * 假定trs_hycloud_iip与trs_mas为两台不同的服务器
+> * 每个节点建立一个中间库,命名为trs_data_migration_city[n]
+> * 分别在trs_hycloud_iip服务器与trs_mas服务器建立两个mas中间库
+       mas中间库均命名为trs_data_migration_mas
+
+
 > SQL脚本说明:
 > * 0开头:脚本为数据修复类SQL。
 > * 1开头:脚本中间表。有data_migration_log(迁移日志表)、data_migration_offset(迁移偏移量表)
 > * 3开头:脚本为迁移表对应的存储过程。
 > * 4开头:脚本为迁移执行脚本。主要数据迁移的脚本都在脚本中。
 > * 6开头:脚本为清除本次迁移的数据脚本。
-## 迁移方式
 
-1. 创建中间库,如:trs_data_migration_city*(用于迁移wcm数据;*表示节点ID)和 trs_data_migration_mas(用于迁移MAS数据);
-    * 将WCM中的以下表迁移到trs_data_migration_city*
+> 增量说明
+> * 六个节点不存在增量情况
+> * 六个节点共用mas,必须增量,每次迁移完成data_migration_offset不可清除、修改数据
+
+> 后续步骤中需手动指定的参数说明:
+> * 节点id例如:4
+> * 节点后缀 例如 '_city4' 注:数字需与节点id匹配
+> * 中间库的数据库名称,当前所使用的中间库库 例如trs_data_migration_city4,
+> * 迁移起始tabelinfoID 传0即可
+> * masID的偏移量 可传0,会从中间库读取,务必保证存储过程执行前两个mas中间库的offset表同步完成。
+> * masurl前缀http://[ip]/mas/openapi/pages.do?method=exPlay&appKey=[appKey]&id=  
+      例如:http://172.16.153.72/mas/openapi/pages.do?method=exPlay&appKey=gov&id=
+
+## 迁移方式
+0. 迁移节点前可做的事:
+   0-1-复制webpic目录下数据至采编服务器相同目录
+   0-2-提前迁移mas数据:
+    **这里解释下为什么mas必须提前迁移**
+    **mas缩略图的存储规则为:masdata/public/[日期]/[masId].images/[pic文件]**
+    **迁移之后masId会变,所以需要修改缩略图存放路径**
+    mas迁移步骤:
+     * 将原mas服务器masdata/public目录下文件全部拷贝至新服务器临时文件夹
+     **这里再解释下为什么必须用临时文件夹**
+     **原视频id、日期与当前mas文件下极有可能相同,造成意料之外的错误**
+     * 将mas库中以下几张表的数据迁移到与trs_mas相同环境下的trs_data_migration_mas中间库
+        * mas_publishedvideo
+        * mas_videostream
+        * mas_masid
+        * mas_masvideo
+   * mas中间库 trs_data_migration_mas,迁移mas数据  
+     ```sql
+         #mas数据迁移
+         call sp_city_mas();
+     ```
+   * 执行python脚本修改缩略图文件夹名称(暂未提供)
+   * 将临时文件夹与正式文件夹合并
+     
+1. 正式迁移开始:
+    创建节点中间库,trs_data_migration_city[n](用于迁移wcm数据;n表示节点ID,如trs_data_migration_city4)和 trs_data_migration_mas(用于迁移MAS数据);
+    * 将WCM中的以下表迁移到trs_data_migration_city[n]
         * 所有元数据表(wcmmetatable...)
         * wcmappendix
         * wcmchannel
@@ -31,14 +75,21 @@
         * xwcmtableinfo
         * xwcmviewfieldinfo
         * xwcmviewinfo
-    * 将mas表的数据迁移到trs_data_migration_mas
+    * 重新将mas库中以下几张表的数据迁移到与trs_mas相同环境下的trs_data_migration_mas中间库
         * mas_publishedvideo
         * mas_videostream
         * mas_masid
         * mas_masvideo
+        
 2. 处理中间库的脏数据和加载SQL脚本。
-   * 中间库trs_data_migration_city*,在Navicat中,中间库运行0-3开头的所有SQL存储过程。如果该节点第一次运行使用全量下的迁移SQL;
+   *** 中间库trs_data_migration_city[n],在Navicat中,中间库运行0-3开头的所有SQL存储过程。如果该节点第一次运行使用全量下的迁移SQL;
      在trs_data_migration_mas运行3_sp_data_migration_mas*.sql;
+   * -----   由于sql较多,上述步骤可以按下方分割线内步骤减轻实施工作  ----
+   * 工程下src\com\trs\exchange\MyScripts.java可对应生成merge.sql,
+   * 在trs_data_migration_city[n]中运行0,1,3,4_merge.sql
+   * 在trs_mas服务器下的trs_data_migration_mas库运行mas_merge.sql
+   * 在trs_hycloud_iip服务器下的trs_data_migration_mas无需运行sql
+   * ---------------------------------------------------------------------
    * 清理脏数据脚本。
      ```sql
         #删除有问题的素材库数据
@@ -59,7 +110,7 @@
      ``` 
    
 3. 迁移站点,栏目,视图,模板等基本数据。(用户可以在新系统中增加角色,调整视图和模板)
-    * 中间库trs_data_migration_city*,处理数据中视图字段,使字段字段对应;
+    * 中间库trs_data_migration_city[n],处理数据中视图字段,使字段字段对应;
       ```sql
         # 相关视频 FieldType 由 51 变为 20
         update XWCMDBFieldInfo set FieldType=20 where FieldType=51;
@@ -83,60 +134,73 @@
         update XWCMDBFieldInfo set FieldType=12 where FieldType=63;
         update XWCMViewFieldInfo set FieldType=12 where FieldType=63;
       ```
-    * 中间库trs_data_migration_city*,迁移站点,栏目,视图到trs_hycloud_iip;
+    * 中间库trs_data_migration_city[n],迁移站点,栏目,视图到trs_hycloud_iip;
       ```sql
         call sp_city_base(节点ID);
       ```
-    * 中间库trs_data_migration_city*,处理元数据表信息;需要先对迁移元数据表进行整理,将需要迁移的元数据表拷贝到中间库;
+    * 中间库trs_data_migration_city[n],处理元数据表信息;需要先对迁移元数据表进行整理,将需要迁移的元数据表拷贝到中间库;
       * 执行存储过程update_data_dbfield.sql和update_data_table.sql,。中间库,删除多余字段元数据,添加默认的元数据字段
+      **注意该脚本结果为sql 脚本。需要复制脚本再执行一遍。**
        ```sql
-         # 注意该脚本结果为sql 脚本。需要复制脚本再执行一遍。
          call update_data_table('_city4',迁移起始tabelinfoID);
        ```
-      * 中间库trs_data_migration_city*,中间库修改元数据表名;
+      * 中间库trs_data_migration_city[n],中间库修改元数据表名;
+      **注意该脚本结果为sql 脚本。需要复制脚本再执行一遍。**
+      * 获取修改元数据的表名的SQL;拷贝以下SQL生成的结果,运行生成的SQL。
+      
       ```sql
-       #获取修改元数据的表名的SQL;拷贝以下SQL生成的结果,运行生成的SQL。
        SELECT
-       	CONCAT( 'ALTER TABLE ', table_name, ' RENAME TO ', table_name, '_city4', ';' ) sqls 
+       	CONCAT( 'ALTER TABLE ', table_name, ' RENAME TO ', table_name, 节点后缀 , ';' ) sqls 
        FROM
        	information_schema.TABLES 
        WHERE
-       	table_schema = '中间库的数据库名称,比如:trs_data_migration_city4' 
+       	table_schema = 当前使用的数据库
        	AND table_name LIKE 'wcmmetatable%';
       ```
-      * 中间库trs_data_migration_city*,生成创建表sql以保存元数据表索引;拷贝以下SQL生成的结果,运行生成的SQL。
+      * 中间库trs_data_migration_city[n],生成创建表sql以保存元数据表索引;拷贝以下SQL生成的结果,运行生成的SQL。
       ```sql
-        SELECT concat('create table trs_hycloud_iip.wcmmetatable',TABLENAME,'_city5 like ','wcmmetatable',TABLENAME,'_city5;') from xwcmtableinfo;
+        SELECT concat('create table trs_hycloud_iip.wcmmetatable',TABLENAME,'_city4 like ','wcmmetatable',TABLENAME,'_city4;') from xwcmtableinfo;
       ```
 4. 迁移数据 和 附件。
 
-   * 中间库trs_data_migration_city*,将wcmdocuemnt,wcmchnldoc 元数据表中的数据拷贝到trs_hycloud_iip;拷贝以下SQL生成的结果,运行生成的SQL。
+   * 中间库trs_data_migration_city[n],将wcmdocuemnt,wcmchnldoc 元数据表中的数据拷贝到trs_hycloud_iip;拷贝以下SQL生成的结果,运行生成的SQL。
      ```sql
        #生成插入数据sql
-       SELECT concat('INSERT INTO trs_hycloud_iip.wcmmetatable',TABLENAME,'_city5 SELECT * from ','wcmmetatable',TABLENAME,'_city5;') from xwcmtableinfo;
+       SELECT concat('INSERT INTO trs_hycloud_iip.wcmmetatable',TABLENAME,'_city4 SELECT * from ','wcmmetatable',TABLENAME,'_city4;') from xwcmtableinfo;
      ```
-   * 中间库trs_data_migration_city*,执行迁移脚本
+   * 中间库trs_data_migration_city[n],执行迁移脚本
      ```sql 
         #注意检查其中sp_data_migration_wcmmetatable 存储过程是否执行成功。查看结果是否存在 "sp_data_migration_wcmmetatable 执行完成"
         call sp_city_data(节点ID)
      ```
-   * 中间库 trs_data_migration_mas,迁移mas数据  **注意必须要对迁移数据表建主键索引**
-     ```sql
-         #mas数据迁移
-         call sp_city_mas();
-     ```
-   * 中间库trs_data_migration_city*,迁移附件  **注意必须要对迁移数据表建主键索引**
+   * 中间库 trs_data_migration_mas,迁移mas数据
+      ```sql
+          #mas数据迁移
+          call sp_city_mas();
+      ```
+
+   * 节点中间库trs_data_migration_city[n],迁移附件  
+   **注意迁移附件前必须完成数据的迁移**
+   **必须先完成迁移上一步骤的mas信息**
+   **同步trs_mas服务器下mas中间库的data_migration_offset表至trs_hycloud_iip服务器下的mas中间库**
+   **务必完成mas中间库偏移量同步操作,下一步骤中masId偏移量会从中间库读取**
      ```sql
         #迁移附件
-        call sp_city_appendix(节点ID, masID的偏移量);
+        call sp_city_appendix(节点ID, 0);
      ```
-   * 中间库trs_data_migration_city*,修改元数据中相关图片,相关视频字段不对
+   * 中间库trs_data_migration_city[n],修改元数据中相关图片,相关视频字段不对
      ```sql
         #注意检查其中update_data_relation_appendix_2 存储过程是否执行成功。查看结果是否存在 "update_data_relation_appendix_2 执行完成"
-       call update_data_relation_appendix(节点ID, masurl前缀, 起始tabelID,起始docId);
-     ```
- 5. 其他工具
-    * 自动生成索引  ![索引相关规则改](img/IdxId1.png)
+       call update_data_relation_appendix(节点ID, masurl前缀, 0,0);
+     ```  
+ 5. 清除redis缓存,启动后台后的操作:
+    * 生成所有视图应用:进入http://ip/gov/wcm_use--应用工具--生成视图应用
+    * 发布全部站点
+    * 验证其他功能
+ 
+ 
+ 6. 其他工具
+    * 自动生成索引  ![索引相关规则](./img/IdxId.png)
       通过配置文件 idxid.generatedtable.properties 配置需要生成的元数据表名称。