2019周筆記(2.25-3.01)(壓縮資料庫)

来源:https://www.cnblogs.com/dissun/archive/2019/03/03/10466129.html
-Advertisement-
Play Games

公司窮,硬碟少,感測數據多,時不時就需要壓縮資料庫,這周都在乾這個事,就稍微專註的看了下[DBCC SHRINKFILE ]和[DBCC SHRINKDataBase ]的區別,發現還是沒看懂,而且有文章說做過多次試驗後發現msdn中的說法也不是完全正確。 那這次就只記錄一些比較關鍵的東西。首先[D ...


公司窮,硬碟少,感測數據多,時不時就需要壓縮資料庫,這周都在乾這個事,就稍微專註的看了下[DBCC SHRINKFILE ]和[DBCC SHRINKDataBase ]的區別,發現還是沒看懂,而且有文章說做過多次試驗後發現msdn中的說法也不是完全正確。

那這次就只記錄一些比較關鍵的東西。首先[DBCC SHRINKFILE ]是[DBCC SHRINKDataBase ]的一個執行子集,也就是執行[DBCC SHRINKDataBase ]其實是對多個文件進行[DBCC SHRINKFILE ]操作。

基本語法:
DBCC SHRINKFILE(文件名|文件ID,希望將日誌收縮到的目標大小,EMPTYFILE | NOTRUNCATE | TRUNCATEONLY)
--文件名(很多朋友這裡容易填錯,這裡可以去資料庫右鍵屬性中,找到“文件”菜單中,裡面的“邏輯名稱”)
--目標大小,也就是我們希望把文件壓縮到的理想尺寸,單位Mb,如果一個日誌有10G,我們希望壓縮到1G,但是實際數據已經占用3G,那麼最終壓縮出來也是3G。
--NOTRUNCATE | TRUNCATEONLY參考下麵SHRINKDataBase,這裡只說EMPTYFILE。它是通過把數據遷移到文件組的中的其他文件來清空源文件,然後配合使用ALTER DATABASE [資料庫名稱] REMOVE FILE [FileA] 命令。(可是我自己測試執行後總是提示“文件組中空間不足,無法完成清空文件操作”,有理解的童鞋可以留言跟我說下,硬碟空間肯定是足夠的。)

基本語法:
DBCC SHRINKDATABASE(資料庫名|資料庫ID|0,目標百分比,NOTRUNCATE|TRUNCATEONLY)
--第一個參數0,表示收縮當前資料庫
--目標百分比,可選,據說是只對NOTRUNCATE起作用,因為TRUNCATEONLY只是截斷尾部(這個參數是最難理解的,看了好幾篇文章,每個人的說法都不一樣)(其中一篇博文通過測試,說明MSDN寫法有誤,正確的是百分比只對TRUNCATEONLY生效,對NOTRUNCATE反而沒有作用http://www.mamicode.com/info-detail-1493145.html)
--第三個參數可選,NOTRUNCATE表示將文件末尾已分配的頁移動到文件前面未分配的頁。文件末尾的可用空間不會返回給操作系統,文件的物理大小也不會改變。TRUNCATEONLY表示將文件末尾的所有可用空間都會釋放給操作系統,但不在文件內部執行頁移動操作。因此,使用此參數數據文件只能收縮最近分配的區。有文章稱在不選擇時,會先執行NOTRUNCATE,然後執行TRUNCATEONLY。

結果集列解釋。
DbId 資料庫引擎試圖收縮的文件的資料庫標識號。
FileId 資料庫引擎試圖收縮的文件的文件標識號。
CurrentSize 文件當前占用的 8 KB 頁數。
MinimumSize 文件最低可以占用的 8 KB 頁數。 此數字對應於文件的大小下限或最初創建大小。
UsedPages 文件當前使用的 8 KB 頁數。
EstimatedPages 資料庫引擎估計文件能夠收縮到的 8 KB 頁數。

註:收縮操作不是一件值得經常執行的操作,會帶來碎片, 下麵帶來重建索引的方法。
整理Index的方式有兩種:
DBCC INDEXDEFRAG(DB, TABLE, INDEX) WITH NO_INFOMSGS 和
DBCC DBREINDEX(TABLE, '', 0)
INDEXDEFRAG是線上重整Index,不會對Table鎖定,但是由於INDEXDEFRAG是對Index的重組,所以Index的數據頁不一定是連續的。

DBREINDEX會對Table進行鎖定,重建索引。

 

--2019.02.25

壓縮資料庫,釋放物理空間
ALTER DATABASE IotDB_Beta SET RECOVERY SIMPLE
DBCC SHRINKDATABASE(IotDB_Beta,5)

//或者直接壓縮日誌文件

//DBCC SHRINKFILE (N'IotDB_Beta_log' , 5) 

ALTER DATABASE IotDB_Beta SET RECOVERY FULL

 

--2019.02.26
查看資料庫各個表占用的空間,以及個表的索引所占空間(這個暫時不深究了,反正挺好用,觀察表數據占用空間以及索引占用的空間)
;with cte as (
(select t.name as TableName,i.name as IndexName,
sum(row_count)as row_count,
SUM (s.used_page_count) as used_pages_count

FROM sys.dm_db_partition_stats AS s
JOIN sys.tables AS t ON s.object_id = t.object_id
JOIN sys.indexes AS i ON i.[object_id] = t.[object_id] AND s.index_id = i.index_id
group by t.name, i.name)
union all
(select t.name as TableName,i.name as IndexName,
sum(row_count)as row_count,
SUM (s.used_page_count) as used_pages_count
FROM sys.dm_db_partition_stats AS s
JOIN sys.views AS t ON s.object_id = t.object_id
JOIN sys.indexes AS i ON i.[object_id] = t.[object_id] AND s.index_id = i.index_id
group by t.name, i.name)
)
select
cte.TableName,
cte.IndexName,
cast((cte.used_pages_count * 8.)/1024 as decimal(10,3)) as TableSizeInMB
from cte
order by 1 desc;
go

 

--2019.02.27
一、在普通同步方法中調用非同步方法。

public async Task TestAsyncMethod()
{
//do it...
}

//在主方法中調用,加上Wait();因為場景中這裡不需要非同步,如果不加wait()會導致TestAsyncMethod方法還沒有得到結果前,程式已經往下運行。

TestAsyncMethod().Wait();

同樣的場景如果需要拿到非同步方法的返回值

public async Task<int> TestAsyncMethodWithReturn()
{
    //do it...
    return 0;
}

//主方法中

TestAsyncMethodWithReturn().Wait();
int i = TestAsyncMethodWithReturn().GetAwaiter().GetResult();

 

二、相反的,如果想在非同步方法中去調用同步方法。出現這想法,是因為我本來有一系列webApi非同步方法在執行,非同步方法的最後一步去調用spring Dao操作資料庫,這個是不能非同步的,所以只能在非同步中去調用同步方法,最開始我的寫法是這樣:

public async Task<int> AsyncExecuteSql(string sql)
{
    Task<int> task = new Task<int>(() =>     baseDao.ExecuteNonQuerySql(sql));
    task.Start();
    int x = await task;
    //或者
    //int x = await Task.Run(() => baseDao.ExecuteNonQuerySql(sql)); 
    return x;
}

一直都執行的好好地,我以為沒什麼問題,直到有一天我寫了一個大批量導入演示數據的功能,其中我用winform多次調用其中一個非同步方法時,莫名其妙只執行一次,但是就是不返回信息,導致所有程式阻塞。後來查了好久,看到了微軟文檔中一個官方方法,用委托方法。(https://docs.microsoft.com/zh-cn/dotnet/standard/asynchronous-programming-patterns/calling-synchronous-methods-asynchronously)

/*第一步創建非同步回調委托*/
/// <summary>
/// 在非同步方法中調用同步資料庫操作方法委托
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
public delegate int AsyncExecuteSqlCaller(string sql);

/*第二步用委托去調用需要被調用的方法*/
/// <summary>
/// 直接執行拼接好的SQL(非同步)
/// </summary>
/// <param name="sql"></param>
public async Task<int> AsyncExecuteSql(string sql)
{

    AsyncExecuteSqlCaller caller = new AsyncExecuteSqlCaller(baseDao.ExecuteNonQuerySql);
    IAsyncResult result = caller.BeginInvoke(sql, null, null);
    int x = caller.EndInvoke(result);//這裡會阻塞線程,所以這種方法不能用在視圖層,否則會卡死界面。 
    return x;
}

修改完成後,最終測試在webApi、和winform中都能正常運行。但是我依舊不明白問題出在哪裡,最近沒有時間深究,後面再找高手指點迷津。

 

 --2019.02.28

一、MVC中如何給所有action加上校驗特性,同時對個別action網開一面,例如

1、如何給控制器的每個方法都加上session校驗特性,一般是進行登錄判斷。

 /*第一步、加上特性類*/
    public class AuthenticationAttribute : ActionFilterAttribute
    {
        public AuthenticationAttribute()
        {
            this.IsUsedAttribute = true;//這個構造方法在這個場景下是多餘的,但是如果寫的特寫比較複雜,需要一些特定初始化時,就比較有效。
        }

        /// <summary>
        /// 是否啟用session驗證
        /// </summary>
        public bool IsUsedAttribute
        {
            get;
            set;
        }

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            if (filterContext.HttpContext.Session["UserID"] == null || string.IsNullOrWhiteSpace(filterContext.HttpContext.Session["UserID"].ToString()))
            {
                if (IsUsedAttribute)
                {
                    filterContext.Result = new RedirectToRouteResult("Default", new System.Web.Routing.RouteValueDictionary(new
                    {
                        action = "Login",
                        controller = "User"
                    }));
                }
            }  
            base.OnActionExecuting(filterContext);
        }
    }

 

/*第二步,把特性加到過濾器,表示所有Action 都受這個特性約束*/
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
            filters.Add(new AuthenticationAttribute());
        }
    }

 

 

/*第三步,在不需要的action前單獨設置*/

        [AuthenticationAttribute(IsUsedAttribute = false)]
        public ActionResult Login()
        {
            return View();        
        }DBCC SHRINKFILE (N'DB_Name_log' , 11, TRUNCATEONLY) 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、卸載安裝(來自百度經驗) 完全卸載: 1. 停止相關服務 2. 運行Universal Installer,卸載產品 3. 清理註冊表 4. 重啟電腦,刪除目錄(Oracle文件夾和app文件夾) 安裝: 1. 運行setup.exe 2.取消勾選“接收安全更新”選項 3. 選擇創建和配置資料庫 ...
  • 在MySQL 5.6版本中引入參數explicit_defaults_for_timestamp設置,該參數會影響Timestamp的預設屬性。 同時在MySQL 5.6版本中中,去除一張表只能有一個TIMESTAMP列的限制,允許單表中使用多個時間戳列。 在MySQL 5.6中,當參數explic ...
  • Timestarmp列可以設置兩個屬性:1、DEFAULT CURRENT_TIMESTAMP 表示插入記錄行時,如果未對該列指定值,則使用當前時間來為該欄位賦值2、ON UPDATE CURRENT_TIMESTAMP 表示在更新記錄時,如果為更新該事件戳列,使用當前時間來更新該欄位 如果在定義時 ...
  • 下麵以存儲過程查詢所有為例,非存儲過程(或不是查詢所有將*替換為你想要查詢的列即可)更為簡單, 語法:select * from 表名 where 列名 like'%條件%' 拼接後的set @變數名 = 'select * from 表名 where ' + @條件 + ' like ' + '' ...
  • MySQL基本語法 資料庫操作 增 格式: create database 表名; 示例: 刪 格式: drop database 表名; 示例: 改 直接在文件夾中修改 查 格式: show databases; 示例: 數據表操作 註意:刪、改、查等操作是在使用use 表名之後進行的 增 格式: ...
  • [toc] 前言 操作系統使用 頁面緩存 來填補記憶體和磁碟訪問的差距 對磁碟文件的寫入會先寫入道頁面緩存中 由操作系統來 決定何時 將修改過的臟頁刷新到磁碟 確保修改已經持久化到磁碟,須調用 fsyn c或者 fdatasync 資料庫在事務提交過程中調用fsync將數據持久化到磁碟,才滿足 ACI ...
  • 模擬Oracle+spring.net+NHibernate+MVC 對DLL文件引用問題得註意,庫文件最好放在固定目錄,否則嚴重影響項目遷移的成功, 由此可見,“代碼規範”的重要性(自己大部分時間耽誤在項目部署這點上,可以說是亂引用,導致很多BUG), 還有調試,註意分析,自己獨立解決。 謝謝蘇工 ...
  • https://blog.csdn.net/qq_36173194/article/details/79104171 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...