Vraag Waarom kan DBD :: SQLite niet in een database worden ingevoegd via mijn Perl CGI-script?


Ik voer een SQLite-database uit binnen een Perl CGI-script dat wordt geopend door DBD :: SQLite. Dit wordt uitgevoerd als een rechte CGI op Apache.

De DBI-verbinding werkt goed en selecties kunnen worden uitgevoerd. Nochtans, wanneer ik een tussenvoegsel probeer te doen krijg ik een matrijs met de volgende fout:

DBD::SQLite::st execute failed: unable to open database file(1) at dbdimp.c line 402 at index.cgi line 66

Ik heb geprobeerd om de toegang tot het databasebestand te wijzigen in 666 om dit te proberen, maar ik ontvang nog steeds de foutmelding.

Enig advies?


11
2017-07-14 00:32


oorsprong


antwoorden:


Het lijkt erop dat de map schrijfrechten nodig heeft, de reden is:

SQLite moet een journaalbestand in dezelfde map als de DB kunnen maken voordat er wijzigingen kunnen worden aangebracht. Het journaal wordt gebruikt om ROLLBACK van transacties te ondersteunen.

Van: lijkt schrijfrechten nodig te hebben in de bovenliggende map van db


22
2017-07-14 02:26



SQLite blokkeert tijdelijk het volledige bestand wanneer het invoegingen en updates uitvoert (er is geen vergrendeling op recordniveau als zodanig). Weet je zeker dat je de sloten bevrijdt?

De SQLite-literatuur beveelt aan dat u een transactie start, al uw invoegingen en updates van die transactie verzamelt en vervolgens vastlegt. Dit vermijdt talrijke opeenvolgende bestandsvergrendelingen en verbetert de prestaties.


1
2017-07-14 00:45



Omdat SQLite het volledige databasebestand vergrendelt, wilt u mogelijk een op tijdout gebaseerd retry-mechanisme gebruiken. Ik werkte aan vrijwel hetzelfde probleem toen ik deze gerelateerd vroeg vraag.

Uiteindelijk heb ik iets geschreven dat lijkt op dat van Mark Fowler Poging die opnieuw probeert als de uitzondering die door de sub wordt gegenereerd overeenkomt met een reguliere expressie, in mijn geval:

qr(already in a transaction|database is locked)i

1
2017-07-14 12:45



Het pad naar de map waarin het db-bestand zich bevindt, moet zowel uitvoerbare als beschrijfbare bits bevatten om toegang te krijgen tot het script vanuit het script.

Als u niet wilt dat het db-bestand direct toegankelijk is (zelfs zonder het gebruik van speciale serverbestanden), moet het bovendien toegangsrechten hebben, zoals 600 en als de bevattende map niet direct bekeken mag worden (opnieuw, zelfs zonder de gebruik van speciale serverbestanden) moet het toegangsrechten hebben zoals 700.

Ik gebruik deze setup en het werkt prima, zowel lokaal als op de server waarop ik mijn site host.

Natuurlijk kan de toestemming van de bevattende map niet 700 zijn als er een ander bestand in bestaat dat toegankelijk moet zijn via html, css of javascript. In plaats daarvan zou het 755 moeten zijn.


1
2017-12-08 22:17