由於某種原因我將OpenStack的一個計算節點移除了,但移除前並沒有刪除在其上運行的實例,後來想通過dash刪除這些實例,於是N天過去了,我的dash還顯示如下內容:
很礙眼是不是?於是我打算手動從數據庫中刪除它們!
1.數據庫中與刪除實例相關的表
數據庫中與刪除實例相關的表如下:
fixed_ips記錄給實例分配的fixed ip,floating_ips顯然與實例分配的floating ip有關,但我在實驗中一直沒有使用過floating故不作評斷,instance_actions我這裏是空的不管,instance_faults記錄與實例有關的錯誤不管,instance_info_caches與實例的網絡設置緩存有關,instance_metadata實例的元數據有關不管,instance_type_extra_specs與instance_types與flavor設置有關不管,instances顯然是實例的主表,volumes與實例的volumes有關。我的實驗中沒有floating
ip也沒有volumes故我只關注fixed_ips,instance_info_caches,instances三個表。
2.OpenStack的刪除策略
通過觀察發現Nova中的表中基本都有如下字段:
OpenStack在刪除對象時並不刪除數據庫中的記錄,只是修改deleted_at和deleted字段。
3.操作數據庫
刪除實例的操作主要集中在instances,instance_info_caches,fixed_ips三個表。
3.1操作instances表
下圖是我的數據庫中曾經刪除了的test3(右邊)與現在無法刪除的test3(左邊)的對比:
因此我的操作如下:
update instances set
deleted_at = updated_at,
deleted = 1,
power_state = 0,
vm_state = "deleted",
terminated_at = updated_at,
root_device_name = NULL,
task_state = NULL
where id = 9;
3.2操作instance_info_caches和fixed_ips
這兩個操作簡單,在前一步操作後已經在dash中看不到被刪除的實例了,這兩步操作主要是釋放被刪除實例所佔用的網絡資源,直接上代碼:
update instance_info_caches set
deleted_at = updated_at,
deleted = 1
where id = 9;
update fixed_ips set
instance_id = NULL,
allocated = 0,
virtual_interface_id = NULL
where id = 7;
OK,如法炮製又刪除了另一個實例,總算在dash中不用看那兩個討厭的實例了。