Как получить эксклюзивный доступ к базе данных SQL Server 2005 для восстановления?

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
20
задан Peter Mortensen 5 November 2016 в 22:37
поделиться

7 ответов

Можно вызвать базу данных офлайн и отбросить соединения с:

EXEC sp_dboption N'yourDatabase', N'offline', N'true'

Или Вы можете

ALTER DATABASE [yourDatabase] SET OFFLINE WITH
ROLLBACK AFTER 60 SECONDS

, Откат указывает, выполняется ли что-нибудь. После того периода они будут откатываться. Таким образом, это обеспечивает некоторую защиту.

Жаль я не думал/читал право. Вы могли дребезжать назад онлайн и резервное копирование. На Stack  было также сообщение; Переполнение на отрывок T-SQL для отбрасывания всех соединений вместо того, чтобы дребезжать офлайн сначала: Скрытые Функции SQL Server

19
ответ дан 29 November 2019 в 23:30
поделиться

До сих пор это работало на меня. Я щелкнул правой кнопкой по базе данных> Задачи> Отсоединение...

Это подняло экран, который позволяет Вам просматривать все активные соединения. Можно затем пройти и разъединить каждое соединение. Когда Вы совершаете нападки хорошо, Вы отсоединили базу данных и потребность Присоединить базу данных. Щелкните правой кнопкой по Databases и выберите присоединение, выберите Вас, mdf файл и дб присоединяются. В этой точке у Вас должен быть эксклюзивный доступ к восстановлению.

Примечание: я протестировал, это путем соединения с одной из его баз данных от моей локальной машины и с сервера отбросило соединения с моей базой данных, и я не потерял свое соединение с его базой данных.

2
ответ дан 29 November 2019 в 23:30
поделиться

@mattlant - это - то, что я искал. Я приношу его здесь, таким образом, это находится в потоке.

Use Master
Go

Declare @dbname sysname

Set @dbname = 'name of database you want to drop connections from'

Declare @spid int
Select @spid = min(spid) from master.dbo.sysprocesses
where dbid = db_id(@dbname)
While @spid Is Not Null
Begin
        Execute ('Kill ' + @spid)
        Select @spid = min(spid) from master.dbo.sysprocesses
        where dbid = db_id(@dbname) and spid > @spid
End
8
ответ дан 29 November 2019 в 23:30
поделиться

Я предложил бы говорить с Вашим коллегой и попросить, чтобы он оставил базу данных. (И сделайте его знающий о проблеме, потому что он мог бы потерять изменения, которыми он сделан, когда Вы восстанавливаете.)

Это намного лучше, чем отбрасывание его соединений или установка эксклюзивного доступа, который мог бы вызвать его некоторое неудобство.

1
ответ дан 29 November 2019 в 23:30
поделиться

Ну, можно уничтожить процессы SQL, и сессии с УНИЧТОЖАЮТ .

, Но если Вы просто отбрасываете все его текущие соединения, он не просто вновь откроет их?

, вероятно, просто необходимо пойти, говорят ему, что Вы собираетесь восстановить от резервного копирования, таким образом, он прекращает соединяться некоторое время.

1
ответ дан 29 November 2019 в 23:30
поделиться

Во-первых, Вы не можете восстановить базу данных, если Вы не единственный человек, в настоящее время соединяемый, и Вы имеете права администратора. Необходимо сначала сказать коллеге, что необходимо восстановить и попросить, чтобы он был уверен сценарию любые изменения, которые не могли бы быть на резервных носителях. Это только вежливо и мешает коллегам уничтожать Вас.

Следующий Вы устанавливаете базу данных на однопользовательский режим. Можно искать, как сделать это в Книгах Онлайн. Это препятствует тому, чтобы кто-либо еще соединился, в то время как Вы делаете это, и дает Вам шанс уничтожить существующие соединения. Важно перейти к однопользовательскому режиму, потому что никто больше ничего не должен делать к базе данных, в то время как Вы восстанавливаете.

Затем Вы выполняете процесс восстановления.

1
ответ дан 29 November 2019 в 23:30
поделиться

Я считаю, что это намного быстрее и лучше, чем отключение от сети. Прочтите об этом в MSDN , чтобы понять предостережения. Если вы используете статистику aysnc, вы также должны отключить их.

-- set single user, terminate connections
ALTER DATABASE [target] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
RESTORE ...
ALTER DATABASE [target] SET MULTI_USER

«С немедленным откатом» является важным условием «завершения». Если оставить это без внимания, ждет вечность. Более удобная версия вышеизложенного дает пользователю несколько секунд для завершения транзакций.

ALTER DATABASE [target] SET SINGLE_USER WITH ROLLBACK AFTER 5

Автономный режим - хорошая идея, если вы хотите копировать файлы базы данных, сценарий, который может быть удобен в настольных версиях SQL. Слишком тяжело для этого сценария. В автономном режиме это было бы предпочтительнее. SQL отходит от sp_dboption .

ALTER DATABASE [target] SET OFFLINE WITH ROLLBACK AFTER 5
14
ответ дан 29 November 2019 в 23:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: