数据库的数据同步

 

以下为Mysql的示例,sql需要适当修改

 

   #region Mysql数据表的转移和备份

        public ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);

        /// <summary>
        /// 同步,超过intervalDays天的数据。从表数据表到表记录表
        /// </summary>
        /// <param name="TbName">需要同步的表名</param>
        /// <param name="MinRowCtn">数据表总数据行数必须大于设置数才进行数据同步</param>
        /// <param name="intervalDays">超时天数,默认为7</param>
        /// <param name="PrimaryKey">主键(自增长主键)名称,默认为Id</param>
        public void SynDataToHis(string TbName,string DataBaseName, int MinRowCtn = 5000, int intervalDays = 7, string PrimaryKey = "Id")
        {
            string Msg = $"SynData,表名:【{TbName}】,";
            int LimitRowsCtn = 2000;//每次处理数据条数
            string TbNameHistory = $"{TbName}_History";
            int ExcueCtn = 0;
            try
            {

                _db.Execute($" CREATE TABLE If Not Exists {DataBaseName}.{TbNameHistory} LIKE  {DataBaseName}.{TbName}  ; ");

                int RowsCtn = 1;

                while (RowsCtn > 0)
                {
                    ExcueCtn++;
                    if (ExcueCtn > 500) break; //执行五百次退出循环
                    long LeaveRowCtn= _db.FirstOrDefault<long>($" SELECT count(*) from {DataBaseName}.{TbName}  "); 
                    if (LeaveRowCtn <= MinRowCtn) break;//表剩余行数小于设置行数退出循环


                    List<long> lstOld = _db.Fetch<long>($"  SELECT * from {DataBaseName}.{TbName}  WHERE CreateDate <  date_add(NOW(), interval -{intervalDays.ToString()} day)  ORDER BY `{PrimaryKey}` LIMIT {LimitRowsCtn} ");

                    RowsCtn = lstOld.Count;

                    if (RowsCtn > 0)
                    {

                        Msg = $"SynData,表名:【{TbName}】,";

                        long MaxId = lstOld.Max();
                        try
                        {
                            List<DTc> lstOld2 = _db.Fetch<DTc>($"  select COLUMN_NAME, DATA_TYPE from information_schema.COLUMNS where table_name = '{TbName}' and TABLE_SCHEMA='{DataBaseName}'  ");

                            //防止ID主键重复导致的报错,加符号【`】防止关键字
                            string ColName = string.Join(",", lstOld2.Where(a => a.COLUMN_NAME.ToUpper() != PrimaryKey.ToUpper()).Select(a => "`" + a.COLUMN_NAME + "`"));

                            string sql = $"  INSERT INTO {DataBaseName}.{TbNameHistory} ({ColName}) SELECT {ColName} FROM {DataBaseName}.{TbName} WHERE `{PrimaryKey}` <= {MaxId} ";
                            var d1 = _db.Execute(sql);
                            Msg = Msg + ";新增成功:" + d1;

                            var d2 = _db.Execute($"   DELETE from {DataBaseName}.{TbName} WHERE `{PrimaryKey}` <=  {MaxId} ");
                            Msg = Msg + ";删除成功:" + d2;
                        }
                        catch (Exception ex)
                        {
                            Msg = Msg + ";同步异常:" + ex.Message;
                        }

                        log.Info(Msg);
                    }
                }


            }
            catch (Exception e)
            {
                log.ErrorFormat($"{Msg},异常:{0}", e.Message + e.StackTrace);
            }
        }


        public class DTc
        {
            public string COLUMN_NAME { get; set; }
            public string DATA_TYPE { get; set; }
        }


        #endregion

  

  

  

 

posted @ 2023-01-09 15:14  人生为卒  阅读(36)  评论(0)    收藏  举报