Straight to answer your questions :
Can I stop, pause, or cancel the backup after it has started if it is taking too long or slowing things down too much?
You cannot pause a backup - either running using Tsql or using sql agent job. If your db is in mirroring, then when you failover the backup gets killed.
Since you are on sql server 2008, recently I ran into a weird situation that caused an outage of one of our critical app is that if you are not on the latest SP (2008 SP4) - we were running sp1 on on node that had a bug and was fixed in SP1+CU4 - It was resolved in CU4 for SP1:https://support.microsoft.com/en-US/help/973602. Search, “970133” for: FIX: When you create a compressed backup for a database in SQL Server 2008, you cannot stop the backup operation if the backup operation stops responding.
You can stop it or kill it using the
kill spid command.
you have to be cautious as if you kill a job that is already in progress, it has to
ROLLBACK which will take some or more time.
Is a backup just a job, that I would just stop the job?
Depends on how you are running the backup. If you run it using SQL Agent job, then its a job which you can
STOP or if you are running it directly from SSMS or SQLCMD, then you can
KILL the command.
When doing a backup, are you able to view the progress, and see an estimated completion time of the backup? If so, how do you view its progress?
You can use DMVs to monitor the backup (or restore) progress (if you are not using
WITH STATS = number):
----- find out the ETA time for restore and backup progress
CAST(((DATEDIFF(s,start_time,GetDate()))/3600) as varchar) + ' hour(s), '
+ CAST((DATEDIFF(s,start_time,GetDate())%3600)/60 as varchar) + 'min, '
+ CAST((DATEDIFF(s,start_time,GetDate())%60) as varchar) + ' sec' as running_time,
CAST((estimated_completion_time/3600000) as varchar) + ' hour(s), '
+ CAST((estimated_completion_time %3600000)/60000 as varchar) + 'min, '
+ CAST((estimated_completion_time %60000)/1000 as varchar) + ' sec' as est_time_to_go,
dateadd(second,estimated_completion_time/1000, getdate()) as est_completion_time
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) s
WHERE r.command in ('RESTORE DATABASE', 'BACKUP DATABASE', 'RESTORE LOG', 'BACKUP LOG')
Some food for thoughts :