in oracle/pkg/database/dbdaemon/dbdaemon_server.go [160:202]
func (d *DB) shutdownDatabase(ctx context.Context, mode godror.ShutdownMode) error {
// Consider allowing PRELIM mode connections for SHUTDOWN ABORT mode.
// This is useful when the server has maxed out on connections.
db, err := sql.Open("godror", "oracle://?sysdba=1")
if err != nil {
klog.ErrorS(err, "dbdaemon/shutdownDatabase: failed to connect to a database")
return err
}
defer db.Close()
oraDB, err := godror.DriverConn(ctx, db)
if err != nil {
return err
}
if err := oraDB.Shutdown(mode); err != nil {
return err
}
// The shutdown process is over after the first Shutdown call in ABORT
// mode.
if mode == godror.ShutdownAbort {
return err
}
_, err = db.Exec("alter database close normal")
if err != nil && strings.Contains(err.Error(), "ORA-01507:") {
klog.InfoS("dbdaemon/shutdownDatabase: database is already closed", "err", err)
err = nil
}
if err != nil {
return err
}
_, err = db.Exec("alter database dismount")
if err != nil && strings.Contains(err.Error(), "ORA-01507:") {
klog.InfoS("dbdaemon/shutdownDatabase: database is already dismounted", "err", err)
err = nil
}
if err != nil {
return err
}
return oraDB.Shutdown(godror.ShutdownFinal)
}