Interfacing 5V and 3V3 I2C busses
You can't connect a 5V I2C bus (e.g. an Arduino board) to a 3V3 I2C device (e.g. a Raspberry Pi) without damaging it, so in this situation you would need to its the 3.3V I2C bus to connect to a 5V I2C device. This means no over voltage damage will occur, but this will only work properly if the 5V device I2C pins are specified as having a min high level voltage which is lower than 3.3V. To find this you need to look in the electrical characteristics section of the datasheet for the 5V part and you will often find the pins are specified with a min high level voltage of say 0.8Vss. If Vss = 5V then 0.8Vss = 4V so no-where near the 3.3V needed. You may find you can get it to work in practice, but you are operating well outside the specifications of the 5V device and it working will be down to luck and very bad electronic engineering on your part. Murphys law says it will stop working just when you least expect it. No damage will be caused, but the 5V device will simply not see some or all of the high levels of the I2C bus, causing it to receive nothing or bad data.
Interfacing Using Mosfets
Notes about this solution
Any I2C device pulling down its own bus must also be able ot sink the pull-up resistor current of the other bus.
The mosfets gates must be wired on the lower voltage supply side.
The mosfets must have a 'Vgs on' voltage specification which is less than the minimum supply voltage (BSN20 Vgs = 1.8V max)
If the 3.3V supply fails the 5V will remain operational. If the 5V supply fails the 3.3V bus will be clamped.
I2C Bus Switching
I2C Bus Extenders
Up to 50m