|
27 | 27 | PARSER.add_argument("--asset_type", type=str, help="MSSQL asset type (AvailabilityGroup, Instance, Database)", required=False)
|
28 | 28 | PARSER.add_argument("--restore_db_prefix", type=str, help="Restore database name prefix", required=True)
|
29 | 29 | PARSER.add_argument("--restore_db_path", type=str, help="Restore database path", required=True)
|
30 |
| -PARSER.add_argument("--recoveralluserdbs", type=int, help="Recover all user databases", required=False, default=0) |
| 30 | +PARSER.add_argument("--recover_all_user_dbs", type=int, help="Recover all user databases", required=False, default=0) |
| 31 | +PARSER.add_argument("--recover_from_copy", type=int, help="Recover from the copy number specified", choices=[1,2]) |
| 32 | +PARSER.add_argument("--copy_stu_name", type=str, help="Storage Unit name for copies", required=False) |
31 | 33 |
|
32 | 34 | ARGS = PARSER.parse_args()
|
33 | 35 |
|
|
66 | 68 |
|
67 | 69 | print(f"Start Discovery on the instance [{INSTANCE_NAME}] on the host [{ARGS.mssql_server_name}]")
|
68 | 70 | workload_mssql.mssql_instance_deepdiscovery(BASEURL, TOKEN, INSTANCE_ID)
|
69 |
| - # create protection plan and subscribe the assettype to it |
70 |
| - PROTECTION_PLAN_ID = workload_mssql.create_mssql_protection_plan(BASEURL, TOKEN, ARGS.protection_plan_name, ARGS.stu_name, "SQL_SERVER") |
71 |
| - # update protection plan to set MSSQL policy settings to skip offline databases |
72 |
| - workload_mssql.update_protection_plan_mssql_attr(BASEURL, TOKEN, ARGS.protection_plan_name, PROTECTION_PLAN_ID, skip_offline_db=1) |
73 |
| - SUBSCRIPTION_ID = common.subscription_asset_to_slo(BASEURL, TOKEN, PROTECTION_PLAN_ID, SUBSCRIPTION_ASSET_ID) |
| 71 | + if(ARGS.recover_from_copy): |
| 72 | + workload_mssql.create_netbackup_policy(BASEURL, TOKEN, ARGS.protection_plan_name, ARGS.mssql_server_name, ARGS.stu_name, ARGS.copy_stu_name) |
| 73 | + BACKUP_JOB_ID = common.run_netbackup_policy(BASEURL, TOKEN, ARGS.protection_plan_name) |
74 | 74 |
|
75 |
| - # MSSQL backup restore |
76 |
| - print("Start MSSQL backup") |
77 |
| - BACKUP_JOB_ID = common.protection_plan_backupnow(BASEURL, TOKEN, PROTECTION_PLAN_ID, SUBSCRIPTION_ASSET_ID) |
| 75 | + else: |
| 76 | + # create protection plan and subscribe the assettype to it |
| 77 | + PROTECTION_PLAN_ID = workload_mssql.create_mssql_protection_plan(BASEURL, TOKEN, ARGS.protection_plan_name, ARGS.stu_name, "SQL_SERVER") |
| 78 | + # update protection plan to set MSSQL policy settings to skip offline databases |
| 79 | + workload_mssql.update_protection_plan_mssql_attr(BASEURL, TOKEN, ARGS.protection_plan_name, PROTECTION_PLAN_ID, skip_offline_db=1) |
| 80 | + SUBSCRIPTION_ID = common.subscription_asset_to_slo(BASEURL, TOKEN, PROTECTION_PLAN_ID, SUBSCRIPTION_ASSET_ID) |
| 81 | + |
| 82 | + # MSSQL backup restore |
| 83 | + print("Start MSSQL backup") |
| 84 | + BACKUP_JOB_ID = common.protection_plan_backupnow(BASEURL, TOKEN, PROTECTION_PLAN_ID, SUBSCRIPTION_ASSET_ID) |
78 | 85 | #timeout is set at 300 seconds (5 mins to keep looking if the backups are complete)
|
79 | 86 | common.verify_job_state(BASEURL, TOKEN, BACKUP_JOB_ID, 'DONE', timeout=300)
|
80 | 87 |
|
81 | 88 | # give nbwebservice 30 seconds to service any queued tasks, before launching recoveries
|
82 | 89 | time.sleep(30)
|
83 |
| - if (ARGS.recoveralluserdbs != 1): |
| 90 | + if (ARGS.recover_all_user_dbs != 1): |
84 | 91 | # fetch the asset
|
85 | 92 | RECOVERY_ASSET_ID = workload_mssql.get_mssql_asset_info(BASEURL, TOKEN, "database", ARGS.mssql_server_name, DATABASE_NAME, INSTANCE_NAME)
|
86 | 93 | RECOVERY_POINT = common.get_recovery_points(BASEURL, TOKEN, WORKLOAD_TYPE, RECOVERY_ASSET_ID)
|
87 | 94 | print(f"Perform Mssql single database [{DATABASE_NAME}] alternate recovery:[{ARGS.mssql_server_name}]")
|
88 | 95 | ALT_DB = ALT_DB + DATABASE_NAME
|
89 |
| - RECOVERY_JOB_ID = workload_mssql.create_mssql_recovery_request(BASEURL, TOKEN, "post_mssql_singledb_alt_recovery.json", RECOVERY_POINT, RECOVERY_ASSET_ID, ARGS.mssql_username, ARGS.mssql_domain, ARGS.mssql_password, ALT_DB, ALT_DB_PATH, INSTANCE_NAME, ARGS.mssql_server_name) |
| 96 | + RECOVERY_JOB_ID = workload_mssql.create_mssql_recovery_request(BASEURL, TOKEN, "post_mssql_singledb_alt_recovery.json", RECOVERY_POINT, RECOVERY_ASSET_ID, ARGS.mssql_username, ARGS.mssql_domain, ARGS.mssql_password, ALT_DB, ALT_DB_PATH, INSTANCE_NAME, ARGS.mssql_server_name, ARGS.recover_from_copy) |
90 | 97 | print(f"Recovery initiated , follow Job #: [{RECOVERY_JOB_ID}]")
|
91 | 98 | else:
|
92 | 99 | print(f"Perform alternate recovery of all databases")
|
|
104 | 111 | if (RECOVERY_POINT != ""):
|
105 | 112 | print(f"Perform Mssql database [{DATABASE_NAME}] alternate recovery:[{ARGS.mssql_server_name}]")
|
106 | 113 | ALT_DB = ARGS.restore_db_prefix + DATABASE_NAME
|
107 |
| - RECOVERY_JOB_ID = workload_mssql.create_mssql_recovery_request(BASEURL, TOKEN, "post_mssql_singledb_alt_recovery.json", RECOVERY_POINT, RECOVERY_ASSET_ID, ARGS.mssql_username, ARGS.mssql_domain, ARGS.mssql_password, ALT_DB, ALT_DB_PATH, INSTANCE_NAME, ARGS.mssql_server_name) |
| 114 | + RECOVERY_JOB_ID = workload_mssql.create_mssql_recovery_request(BASEURL, TOKEN, "post_mssql_singledb_alt_recovery.json", RECOVERY_POINT, RECOVERY_ASSET_ID, ARGS.mssql_username, ARGS.mssql_domain, ARGS.mssql_password, ALT_DB, ALT_DB_PATH, INSTANCE_NAME, ARGS.mssql_server_name, ARGS.recover_from_copy) |
108 | 115 | else:
|
109 | 116 | print(f"Skipping recovery, could not find RecoveryPoint for [{DATABASE_NAME}] assetid [{RECOVERY_ASSET_ID}]")
|
110 | 117 |
|
111 | 118 | finally:
|
112 | 119 | print("Start cleanup")
|
113 |
| - # Cleanup the created protection plan |
114 |
| - common.remove_subscription(BASEURL, TOKEN, PROTECTION_PLAN_ID, SUBSCRIPTION_ID) |
115 |
| - common.remove_protectionplan(BASEURL, TOKEN, PROTECTION_PLAN_ID) |
| 120 | + if(ARGS.recover_from_copy): |
| 121 | + # Cleanup the created policy |
| 122 | + common.delete_netbackup_policy(BASEURL, TOKEN, ARGS.protection_plan_name) |
| 123 | + else: |
| 124 | + # Cleanup the created protection plan |
| 125 | + common.remove_subscription(BASEURL, TOKEN, PROTECTION_PLAN_ID, SUBSCRIPTION_ID) |
| 126 | + common.remove_protectionplan(BASEURL, TOKEN, PROTECTION_PLAN_ID) |
116 | 127 | workload_mssql.remove_mssql_credential(BASEURL, TOKEN, CREDENTIAL_ID)
|
0 commit comments