Как разблокировать базу данных SQLite? - PullRequest
235 голосов
/ 30 сентября 2008
sqlite> DELETE FROM mails WHERE (`id` = 71);
SQL error: database is locked

Как разблокировать базу данных, чтобы она работала?

Ответы [ 35 ]

1 голос
/ 13 июня 2009

Я столкнулся с этой же проблемой на Mac OS X 10.5.7, где выполнялись скрипты Python из терминальной сессии. Несмотря на то, что я остановил сценарии, а окно терминала находилось в командной строке, при следующем запуске оно выдаст эту ошибку. Решением было закрыть окно терминала, а затем снова открыть его. Не имеет смысла для меня, но это сработало.

1 голос
/ 17 февраля 2012

У меня была такая же проблема. Очевидно, что функция отката перезаписывает файл базы данных журналом, который совпадает с файлом базы данных, но без последнего изменения. Я реализовал это в своем коде ниже, и с тех пор он работал нормально, тогда как раньше мой код просто застревал в цикле, поскольку база данных оставалась заблокированной.

Надеюсь, это поможет

мой код Python

##############
#### Defs ####
##############
def conn_exec( connection , cursor , cmd_str ):
    done        = False
    try_count   = 0.0
    while not done:
        try:
            cursor.execute( cmd_str )
            done = True
        except sqlite.IntegrityError:
            # Ignore this error because it means the item already exists in the database
            done = True
        except Exception, error:
            if try_count%60.0 == 0.0:       # print error every minute
                print "\t" , "Error executing command" , cmd_str
                print "Message:" , error

            if try_count%120.0 == 0.0:      # if waited for 2 miutes, roll back
                print "Forcing Unlock"
                connection.rollback()

            time.sleep(0.05)    
            try_count += 0.05


def conn_comit( connection ):
    done        = False
    try_count   = 0.0
    while not done:
        try:
            connection.commit()
            done = True
        except sqlite.IntegrityError:
            # Ignore this error because it means the item already exists in the database
            done = True
        except Exception, error:
            if try_count%60.0 == 0.0:       # print error every minute
                print "\t" , "Error executing command" , cmd_str
                print "Message:" , error

            if try_count%120.0 == 0.0:      # if waited for 2 miutes, roll back
                print "Forcing Unlock"
                connection.rollback()

            time.sleep(0.05)    
            try_count += 0.05       




##################
#### Run Code ####
##################
connection = sqlite.connect( db_path )
cursor = connection.cursor()
# Create tables if database does not exist
conn_exec( connection , cursor , '''CREATE TABLE IF NOT EXISTS fix (path TEXT PRIMARY KEY);''')
conn_exec( connection , cursor , '''CREATE TABLE IF NOT EXISTS tx (path TEXT PRIMARY KEY);''')
conn_exec( connection , cursor , '''CREATE TABLE IF NOT EXISTS completed (fix DATE, tx DATE);''')
conn_comit( connection )
1 голос
/ 15 декабря 2011

У меня просто была такая же ошибка. После 5 минут поиска в Google я обнаружил, что не закрыл одну оболочку, которая использовала БД. Просто закройте его и попробуйте снова;)

1 голос
/ 09 августа 2016

Я получил эту ошибку в сценарии, немного отличающемся от описанного здесь.

База данных SQLite покоилась в файловой системе NFS, используемой тремя серверами. На 2 серверах я смог успешно выполнить запросы к базе данных, на третьем мне показалось, что я получаю сообщение «база данных заблокирована».

С этой 3-й машиной дело было в том, что на /var не осталось места. Каждый раз, когда я пытался выполнить запрос в ЛЮБОЙ базе данных SQLite, расположенной в этой файловой системе, я получал сообщение «база данных заблокирована», а также эта ошибка в журналах:

8 августа 10:33:38 server01 kernel: lockd: не может контролировать 172.22.84.87

И этот тоже:

8 августа 10:33:38 server01 rpc.statd [7430]: Не удалось вставить: запись /var/lib/nfs/statd/sm/other.server.name.com: на устройстве не осталось места 8 августа 10:33:38 server01 rpc.statd [7430]: STAT_FAIL для server01 для SM_MON 172.22.84.87

После того, как космическая ситуация была обработана, все вернулось к норме.

1 голос
/ 20 апреля 2016

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

  • Убедитесь, что в вашем коде Java нет открытых соединений.
  • Убедитесь, что другие процессы не используют ваш файл базы данных SQLite с lsof.
  • Убедитесь, что владелец пользователя вашего запущенного процесса jvm имеет права на чтение и чтение файла.
  • Попробуйте включить режим блокировки на открытии соединения с помощью

    final SQLiteConfig config = new SQLiteConfig();
    
    config.setReadOnly(false);
    
    config.setLockingMode(LockingMode.NORMAL);
    
    connection = DriverManager.getConnection(url, config.toProperties());
    

Если вы используете файл базы данных SQLite в общей папке NFS, отметьте этот пункт часто задаваемых вопросов SQLite и просмотрите параметры конфигурации подключения, чтобы убедиться, что вы избегаете блокировок, как описано здесь

//myserver /mymount cifs username=*****,password=*****,iocharset=utf8,sec=ntlm,file,nolock,file_mode=0700,dir_mode=0700,uid=0500,gid=0500 0 0
0 голосов
/ 13 декабря 2018

Я также получал блокировки sqlite в приложении C # .NET 4.6.1, которое я создал, когда оно пыталось записать данные, но не при запуске приложения в Visual Studio на моем компьютере разработчика. Вместо этого это происходило только тогда, когда приложение было установлено и запущено на удаленной машине с Windows 10.

Первоначально я думал, что это были разрешения файловой системы, однако оказалось, что драйверы пакетов System.Data.SQLite (v1.0.109.2), которые я установил в проекте с помощью Nuget, вызывали проблему. Я удалил пакет NuGet и вручную сослался на более старую версию драйверов в проекте, и после переустановки приложения на удаленном компьютере проблемы с блокировкой волшебным образом исчезли. Можно только думать, что произошла ошибка с последними драйверами или пакетом Nuget.

0 голосов
/ 25 февраля 2018

Если вы пытаетесь разблокировать базу данных Chrome до , просмотрите ее с помощью SQLite , а затем просто выключите Chrome.

Windows

%userprofile%\Local Settings\Application Data\Google\Chrome\User Data\Default\Web Data

or

%userprofile%\Local Settings\Application Data\Google\Chrome\User Data\Default\Chrome Web Data

Mac

~/Library/Application Support/Google/Chrome/Default/Web Data
0 голосов
/ 30 мая 2016

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

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

0 голосов
/ 22 апреля 2016

В моем случае я тоже получил эту ошибку.

Я уже проверил другие процессы, которые могут быть причиной заблокированной базы данных, такие как (SQLite Manager, другие программы, которые подключаются к моей базе данных). Но нет другой программы, которая подключается к нему, это просто другая активная SQLConnection в том же приложении, которое остается подключенным .

Попробуйте проверить предыдущую активную SQLConnection , которая еще может быть подключена (сначала отключите ее), прежде чем установить новую SQLConnection и новую команду .

0 голосов
/ 29 декабря 2008

Из ваших предыдущих комментариев вы сказали, что файл -journal присутствовал.

Это может означать, что вы открыли и (ЭКСКЛЮЗИВ?) Транзакцию и еще не зафиксировали данные. Ваша программа или какой-то другой процесс оставили журнал позади?

При перезапуске процесса sqlite будет просмотрен файл журнала, очищены все незафиксированные действия и удален файл -journal.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...